HashMap容量分析

了解過HashMap都應(yīng)該知道,HashMap內(nèi)部會(huì)創(chuàng)建一個(gè)Entry<K, V> table數(shù)組來(lái)存放元素艇拍,而且這個(gè)數(shù)組的長(zhǎng)度永遠(yuǎn)都是2的指數(shù)次方握础。那么問題來(lái)了,為什么選擇2的指數(shù)次方呢甚亭?
首先,思考一下計(jì)算出hash值后击胜,應(yīng)該存放在數(shù)組的哪個(gè)位置亏狰?顯然用求余(模)最簡(jiǎn)單。然而模的效率并不高偶摔,看看JDK是怎么做的暇唾,indexFor方法:

static int indexFor(int h, int length) {
    // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
    return h & (length-1);
}

其中h就是hash值,length是table的長(zhǎng)度。對(duì)2的指數(shù)次方求模運(yùn)算(h % length)和h & (length-1)結(jié)果是一樣的策州,這點(diǎn)從代碼注釋也可以知道瘸味,不明白可以看最后的備注。

接著看看為什么容量是2的指數(shù)次方的問題够挂,假如容量分別是16和15兩種情況旁仿,對(duì)應(yīng)的length-1的二進(jìn)制分別是11111110,然后我們思考hash值分別是8和9這兩種情況孽糖,8 & 1111 = 8枯冈,9 & 1111 = 9,存放在table[8]和table[9]對(duì)應(yīng)的位置办悟,沒有發(fā)生碰撞尘奏;然后8 & 1110 = 8,9 & 1110 = 8誉尖,兩個(gè)hash值都被存放在了table的同一位置罪既,顯然發(fā)生了碰撞铸题。放大來(lái)看铡恕,如果容量是15的話,length - 1對(duì)應(yīng)的二進(jìn)制是1110丢间,進(jìn)行與運(yùn)算后探熔,最后一位永遠(yuǎn)是0,即xxx0烘挫,這將會(huì)導(dǎo)致table中0001诀艰,00110101饮六,1001其垄,10110111卤橄,1101這幾個(gè)位置永遠(yuǎn)都不能存放元素了绿满,空間浪費(fèi)不說(shuō),碰撞概率也增大窟扑。而我們2的指數(shù)次方對(duì)應(yīng)的數(shù)length-1后二進(jìn)制全是1喇颁,進(jìn)行與運(yùn)算顯然不會(huì)干擾到原h(huán)ash值,不會(huì)導(dǎo)致table中哪個(gè)位置不能存放元素嚎货。

解釋一下“對(duì)2的指數(shù)次方求模運(yùn)算(h % length)和h & (length-1)結(jié)果是一樣的”橘霎,以4(二進(jìn)制為11)為例:
0 % 4 = 0 同 4 % 4 = 0 ……
1 % 4 = 1 同 5 % 4 = 1 ……
2 % 4 = 2 同 6 % 4 = 2 ……
3 % 4 = 3 同 7 % 4 = 3 ……
00 & 11 = 0 同 100 && 11 = 0 ……
01 & 11 = 1 同 101 && 11 = 1 ……
10 & 11 = 2 同 110 && 11 = 2 ……
11 & 11 = 3 同 111 && 11 = 3 ……
明顯,求余運(yùn)算每4個(gè)一循環(huán)殖属,對(duì)應(yīng)二進(jìn)制大于4之后姐叁,高位的數(shù)字與0進(jìn)行與運(yùn)算,始終為0,效果等同于每4個(gè)一循環(huán)外潜。

總結(jié)一下:使用2的指數(shù)次方作為HashMap中存放元素?cái)?shù)組的大小谭溉,可以避免求余操作,效率較高橡卤,同時(shí)扮念,減少了碰撞次數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碧库,一起剝皮案震驚了整個(gè)濱河市柜与,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嵌灰,老刑警劉巖弄匕,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沽瞭,居然都是意外死亡迁匠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門驹溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)城丧,“玉大人,你說(shuō)我怎么就攤上這事豌鹤⊥龊澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵布疙,是天一觀的道長(zhǎng)蚊惯。 經(jīng)常有香客問我,道長(zhǎng)灵临,這世上最難降的妖魔是什么截型? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮儒溉,結(jié)果婚禮上宦焦,老公的妹妹穿的比我還像新娘。我一直安慰自己睁搭,他們只是感情好赶诊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著园骆,像睡著了一般舔痪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锌唾,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天锄码,我揣著相機(jī)與錄音夺英,去河邊找鬼。 笑死滋捶,一個(gè)胖子當(dāng)著我的面吹牛痛悯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播重窟,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼载萌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巡扇?” 一聲冷哼從身側(cè)響起扭仁,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厅翔,沒想到半個(gè)月后乖坠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刀闷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熊泵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甸昏。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顽分,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筒扒,到底是詐尸還是另有隱情怯邪,我是刑警寧澤绊寻,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布花墩,位于F島的核電站,受9級(jí)特大地震影響澄步,放射性物質(zhì)發(fā)生泄漏冰蘑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一村缸、第九天 我趴在偏房一處隱蔽的房頂上張望祠肥。 院中可真熱鬧,春花似錦梯皿、人聲如沸仇箱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剂桥。三九已至,卻和暖如春属提,著一層夾襖步出監(jiān)牢的瞬間权逗,已是汗流浹背美尸。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斟薇,地道東北人师坎。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像堪滨,于是被迫代替她去往敵國(guó)和親胯陋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 前言 這次我和大家一起學(xué)習(xí)HashMap袱箱,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用惶岭,而且面試中也很頻繁會(huì)問到,因?yàn)樗?..
    liangzzz閱讀 7,990評(píng)論 7 102
  • HashMap 是 Java 面試必考的知識(shí)點(diǎn)犯眠,面試官?gòu)倪@個(gè)小知識(shí)點(diǎn)就可以了解我們對(duì) Java 基礎(chǔ)的掌握程度按灶。網(wǎng)...
    野狗子嗷嗷嗷閱讀 6,667評(píng)論 9 107
  • 一鸯旁、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,265評(píng)論 0 16
  • 我和你的日本料理 曾幾何時(shí),我們并不認(rèn)識(shí)量蕊,你在二樓我在一樓铺罢,我想我們都很怕你……因?yàn)槟闶枪救肆Γ话銇?lái)說(shuō)人力都很...
    丫丫Dcyaec閱讀 215評(píng)論 0 0
  • 1、 昨晚和幾個(gè)友人在群里聊天势就,曦曦突然說(shuō)了一句話泉瞻,我失戀了。 大家不約而同地保持了沉默苞冯,也沒有表示太多驚訝袖牙。倒不...
    尹惟楚閱讀 6,858評(píng)論 41 201