從源代碼看HashMap的加載因子和容量分配

一直知道HashMap有默認(rèn)的容量和加載因子婿失,今天想看看源代碼兔乞,希望能了解的更清楚一些。

我們先看看默認(rèn)的構(gòu)造器吧婆廊,以下為我本機(jī)的JDK6.0的源代碼.

歡迎訪問(wèn)老紫竹的網(wǎng)站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java

/**

*?默認(rèn)的初始化的容量饼疙,必須是2的冪次數(shù)

*?The?default?initial?capacity?-?MUST?be?a?power?of?two.

*/

staticfinalintDEFAULT_INITIAL_CAPACITY?=16;

/**

*?默認(rèn)的加載因子

*/

staticfinalfloatDEFAULT_LOAD_FACTOR?=0.75f;

/**

*?下一個(gè)需要重新分配的尺寸值溺森。等于容量乘以加載因子。

*?也就是說(shuō)宏多,一旦容量到了這個(gè)數(shù)值儿惫,將重新分配容器的尺寸。

*?The?next?size?value?at?which?to?resize?(capacity?*?load?factor).

*?@serial

*/

intthreshold;

publicHashMap()?{

this.loadFactor?=?DEFAULT_LOAD_FACTOR;

threshold?=?(int)(DEFAULT_INITIAL_CAPACITY?*?DEFAULT_LOAD_FACTOR);

table?=newEntry[DEFAULT_INITIAL_CAPACITY];

init();

}

歡迎訪問(wèn)老紫竹的網(wǎng)站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java

從代碼可以看出伸但,默認(rèn)的容量是16肾请,而 threshold是16*0.75 = 12;

我們來(lái)看看增加的部分代碼。

publicV?put(K?key,?V?value)?{

//?我們忽略掉這部分的代碼更胖,只看我們這里最關(guān)心的部分

addEntry(hash,?key,?value,?i);//?這里增加了一個(gè)Entry,我們看看代碼

returnnull;

}

voidaddEntry(inthash,?K?key,?V?value,intbucketIndex)?{

Entry?e?=?table[bucketIndex];

table[bucketIndex]?=newEntry(hash,?key,?value,?e);

if(size++?>=?threshold)//?這里是關(guān)鍵铛铁,一旦大于等于threshold的數(shù)值

resize(2*?table.length);//?將會(huì)引起容量2倍的擴(kuò)大

}

voidresize(intnewCapacity)?{

Entry[]?oldTable?=?table;

intoldCapacity?=?oldTable.length;

if(oldCapacity?==?MAXIMUM_CAPACITY)?{

threshold?=?Integer.MAX_VALUE;

return;

}

Entry[]?newTable?=newEntry[newCapacity];//?新的容器空間

transfer(newTable);//?復(fù)制數(shù)據(jù)過(guò)去

table?=?newTable;

threshold?=?(int)(newCapacity?*?loadFactor);//?重新計(jì)算threshold的值

}

好了,我想我們已經(jīng)清楚大部分了却妨。

其中有一點(diǎn)饵逐,起始容量必須是2的冪次,這如何保證呢彪标?我們來(lái)看看其構(gòu)造方法

publicHashMap(intinitialCapacity,floatloadFactor)?{

//?忽略掉一部分代碼....

//?Find?a?power?of?2?>=?initialCapacity

//?重新查找不比指定數(shù)值大的最大的2的冪次數(shù)

intcapacity?=1;

while(capacity?<?initialCapacity)

capacity?<<=1;

//?其它的初始化代碼?...

}

好了倍权,關(guān)于起始容量和加載因子的探討我們就到這里了。我們應(yīng)該有了一定的了解了捞烟。

總結(jié):

相對(duì)準(zhǔn)確的估算數(shù)據(jù)量薄声,將極大的影響HashMap的性能当船,因?yàn)閞esize是一個(gè)重新分配的過(guò)程,耗時(shí)應(yīng)該是里面最大的默辨。

加載因子較小德频,會(huì)有更多的空間空閑,我不知道這個(gè)0.75是不是一個(gè)折中方案缩幸。也許0.9也是一個(gè)不錯(cuò)的選擇壹置,特別是那些數(shù)據(jù)量雖然很大,但不是經(jīng)常變化的地方表谊,比如公司人員钞护,城市列表等相對(duì)比較固定的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铃肯,隨后出現(xiàn)的幾起案子患亿,更是在濱河造成了極大的恐慌传蹈,老刑警劉巖押逼,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惦界,居然都是意外死亡挑格,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門沾歪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漂彤,“玉大人,你說(shuō)我怎么就攤上這事灾搏〈焱” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狂窑,是天一觀的道長(zhǎng)媳板。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泉哈,這世上最難降的妖魔是什么蛉幸? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮丛晦,結(jié)果婚禮上奕纫,老公的妹妹穿的比我還像新娘。我一直安慰自己烫沙,他們只是感情好匹层,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锌蓄,像睡著了一般升筏。 火紅的嫁衣襯著肌膚如雪仲器。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天仰冠,我揣著相機(jī)與錄音乏冀,去河邊找鬼。 笑死洋只,一個(gè)胖子當(dāng)著我的面吹牛辆沦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播识虚,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肢扯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了担锤?” 一聲冷哼從身側(cè)響起蔚晨,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肛循,沒(méi)想到半個(gè)月后铭腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡多糠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年累舷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夹孔。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡被盈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搭伤,到底是詐尸還是另有隱情只怎,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布怜俐,位于F島的核電站身堡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏佑菩。R本人自食惡果不足惜盾沫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殿漠。 院中可真熱鬧赴精,春花似錦、人聲如沸绞幌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谭确,卻和暖如春帘营,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逐哈。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工芬迄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昂秃。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓禀梳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肠骆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子算途,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 5.1、對(duì)于HashMap需要掌握以下幾點(diǎn) Map的創(chuàng)建:HashMap() 往Map中添加鍵值對(duì):即put(Ob...
    rochuan閱讀 680評(píng)論 0 0
  • HashMap 是 Java 面試必考的知識(shí)點(diǎn)蚀腿,面試官?gòu)倪@個(gè)小知識(shí)點(diǎn)就可以了解我們對(duì) Java 基礎(chǔ)的掌握程度嘴瓤。網(wǎng)...
    野狗子嗷嗷嗷閱讀 6,667評(píng)論 9 107
  • 前文:HashMap是Java程序員最常用的映射(鍵值對(duì))處理數(shù)據(jù)的容器。隨著JDK版本的更新莉钙,1.8相較于1.7...
    是一動(dòng)不動(dòng)的friend閱讀 1,220評(píng)論 0 1
  • 實(shí)際上廓脆,HashSet 和 HashMap 之間有很多相似之處,對(duì)于 HashSet 而言胆胰,系統(tǒng)采用 Hash 算...
    曹振華閱讀 2,513評(píng)論 1 37
  • 今天得知狞贱,公司老總?cè)谫Y刻获,公司重組蜀涨,有一號(hào)人物進(jìn)駐,項(xiàng)目即將重啟蝎毡。 我是回去還是不回厚柳? 目前,自己畢業(yè)兩年沐兵,過(guò)去的工...
    雨季不再回來(lái)閱讀 392評(píng)論 0 1