【Java Collections】Map-HashMap 源碼解析(二)

HashMap 內(nèi)的主要數(shù)據(jù)結(jié)構(gòu)

  1. 內(nèi)部類 Node<K,V>(實(shí)現(xiàn)了Map.entry接口货邓,存儲(chǔ)key-value的基礎(chǔ)類笙隙,鏈表)
  2. table (Node<K,V> 數(shù)組)

基本思路是(后續(xù)會(huì)做更詳細(xì)的解讀):

  1. 根據(jù)key的hash值確定table的index索引
  2. table的每個(gè)index實(shí)際上存儲(chǔ)的是Node鏈表笋额,由第1步確定索引后齐佳,再循環(huán)鏈表如果存在相同key(key.equals)則替換Node的value值增热,否則鏈表尾添加新Node

構(gòu)造函數(shù)

無(wú)參構(gòu)造函數(shù)

threshold 變量為閾值顷级,table大小查過(guò)該變量就會(huì)觸發(fā)擴(kuò)容(resize)
而 threshold = capacity * loadFactor

    public HashMap() {
        // 默認(rèn)擴(kuò)容因子0.75
        this.loadFactor = DEFAULT_LOAD_FACTOR; 
    }
    // table 的初始化推遲到了 map.put(key,value) 的resize()時(shí)
    newCap = DEFAULT_INITIAL_CAPACITY;
    newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
     /** 省略部分代碼 **/
    // 初始化table
    Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
    table = newTab;

Map參數(shù)構(gòu)造函數(shù)

public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;// 默認(rèn)擴(kuò)容因子0.75
        //主要做兩件事情
        //1. 利用上一篇文章提到的 求2的冪 的方法,確定HashMap的size
        //2. 將 m 內(nèi)的key-value(即node)逐個(gè)復(fù)制到該HashMap中
        putMapEntries(m, false);
    }

初始變量構(gòu)造函數(shù)

public HashMap(int initialCapacity, float loadFactor) {
        // 參數(shù)的合法性校驗(yàn)       
         if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        // threshold 為擴(kuò)容閾值错森,超過(guò)該值即觸發(fā)resize
        // tableSizeFor即上篇文章介紹的求2的冪方法
        this.threshold = tableSizeFor(initialCapacity);
    }

// table 的初始化也推遲到了 map.put(key,value) 的resize()時(shí)吟宦,與無(wú)參構(gòu)造函數(shù)不同的是,此處初始化的大小涩维,正是你設(shè)置的initialCapacity殃姓,而threshold也被重新計(jì)算
// 利用threshold做一個(gè)存儲(chǔ)的過(guò)渡,完美做到了一點(diǎn)都不浪費(fèi)不啰嗦的優(yōu)良傳統(tǒng)
newCap = oldThr;
        if (newThr == 0) {
            float ft = (float)newCap * loadFactor;
            newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
                      (int)ft : Integer.MAX_VALUE);
        }
        threshold = newThr;
        Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
        table = newTab;

// 阿里開(kāi)發(fā)規(guī)約建議使用該 初始化函數(shù)瓦阐,設(shè)置初始容量蜗侈,盡可能的避免map.resize帶來(lái)的性能消耗,也提高存儲(chǔ)空間的利用率(用多少聲明多少)
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

小結(jié)

綜上可以發(fā)現(xiàn)睡蟋,初始化主要是設(shè)置table容量相關(guān)值踏幻,具體的table大小初始化推遲到了putValue階段,這也就是下篇文章要介紹的重點(diǎn)戳杀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末该面,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子信卡,更是在濱河造成了極大的恐慌隔缀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傍菇,死亡現(xiàn)場(chǎng)離奇詭異猾瘸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)桥嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)须妻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泛领,你說(shuō)我怎么就攤上這事荒吏。” “怎么了渊鞋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵绰更,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锡宋,道長(zhǎng)儡湾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任执俩,我火速辦了婚禮徐钠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘役首。我一直安慰自己尝丐,他們只是感情好显拜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爹袁,像睡著了一般远荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上失息,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天譬淳,我揣著相機(jī)與錄音,去河邊找鬼盹兢。 笑死邻梆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绎秒。 我是一名探鬼主播确虱,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼替裆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窘问,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辆童,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惠赫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體把鉴,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年儿咱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庭砍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡混埠,死狀恐怖怠缸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钳宪,我是刑警寧澤揭北,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吏颖,受9級(jí)特大地震影響搔体,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜半醉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一疚俱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缩多,春花似錦呆奕、人聲如沸养晋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匙握。三九已至,卻和暖如春陈轿,著一層夾襖步出監(jiān)牢的瞬間圈纺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工麦射, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛾娶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓潜秋,卻偏偏與公主長(zhǎng)得像蛔琅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峻呛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一钩述、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,254評(píng)論 0 16
  • 1.HashMap是一個(gè)數(shù)組+鏈表/紅黑樹(shù)的結(jié)構(gòu)寨躁,數(shù)組的下標(biāo)在HashMap中稱為Bucket值,每個(gè)數(shù)組項(xiàng)對(duì)應(yīng)的...
    誰(shuí)在烽煙彼岸閱讀 1,017評(píng)論 2 2
  • 中華醫(yī)學(xué)會(huì)放射學(xué)分會(huì)對(duì)比劑安全使用工作組 01碘對(duì)比劑分類 目前臨床應(yīng)用的含碘對(duì)比劑的基本結(jié)構(gòu)是3一乙酰一2牙勘,4职恳,...
    狂奔的蝸牛_9573閱讀 5,961評(píng)論 0 2
  • 世間至味留遐意,木槿枝頭起方面。秋風(fēng)颯颯過(guò)黃駒放钦,明月幾人能共一溝渠。 長(zhǎng)空未語(yǔ)笙歌誤恭金,冷墨清光住操禀。落花看盡漫相同,從此...
    問(wèn)字樓閱讀 882評(píng)論 12 49
  • 大學(xué)時(shí)逃了很多課蔚叨,然后去空曠安靜的校園里四處游蕩床蜘。 大部分時(shí)候都懶的拍照。眼睛才是最好的相機(jī)蔑水。但沒(méi)有用相機(jī)和文字記...
    crowforest閱讀 339評(píng)論 0 0