HashMap的loadFactor為什么是0.75?

????????面試core java,HashMap的結構差不多是必問題了。字面意思,真的真的是必問題了。

? ? ? ? 我遇到的問題有:

??????????1. HashMap, ConcurrentHashMap,HashTable 的結構,在JDK 1.7 和1.8 中有什么不同(最基礎)

? ? ? ? ? ?2. put時,是加到鏈表頭還是鏈表尾

? ? ? ? ? ?3. get的時間復雜度(對鏈表,對紅黑樹)

????????然后,在一次糟心的面試中,面試官問問題1 ,我回答了,提到了loadfactor = 0.75, 對方來了句“這個都記,背得挺熟的嘛” , 我:???(黑人問號臉)。?

????????他問,那你說,為什么是0.75 , 不是0.5或者1?

????????這個好回答。 如果是0.5 , 那么每次達到容量的一半就進行擴容,默認容量是16, 達到8就擴容成32,達到16就擴容成64, 最終使用空間和未使用空間的差值會逐漸增加,空間利用率低下。 ?如果是1,那意味著每次空間使用完畢才擴容,在一定程度上會增加put時候的時間。

????????接著,他問我為什么是0.75,不是0.6或者0.8

? ? ? ? 我:……?

========================

? ? ? ? 面試只是檢測知識的一個經歷。 回頭再想想:那為什么是0.75呢? 0.75是 0.5 ~ 1的中間值??(寫到這里,突然想這樣解釋也可以哎,取中間值)

? ? ? ? 然后我去查看了API...

? ? ? ? JDK 1.7中:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put). The expected number of entries in the map and its load factor should be taken into account when setting its initial capacity, so as to minimize the number of rehash operations. If the initial capacity is greater than the maximum number of entries divided by the load factor, no rehash operations will ever occur.

翻譯過來就是:

作為一般規則,默認負載因子(0.75)在時間和空間成本上提供了很好的折衷。較高的值會降低空間開銷,但提高查找成本(體現在大多數的HashMap類的操作,包括get和put)。設置初始大小時,應該考慮預計的entry數在map及其負載系數,并且盡量減少rehash操作的次數。如果初始容量大于最大條目數除以負載因子,rehash操作將不會發生。

? ? JDK 1.8中也有上述內容,并且還有一段如下(現在頭腦清醒了,覺得下面這段與“為什么是0.75”關系不大,不過是百度中能找到的關于這個問題的別人的文章中有著一段):

Ideally, under random hashCodes, the frequency of nodes in bins follows a Poisson distribution with a parameter of about 0.5 on average for the default resizing threshold of 0.75, although with a large variance because of resizing granularity. Ignoring variance, the expected occurrences of list size k are (exp(-0.5) pow(0.5, k) / factorial(k)). The first values are:

? ? ? 0:? ? 0.60653066

? ? ? 1:? ? 0.30326533

? ? ? 2:? ? 0.07581633

? ? ? 3:? ? 0.01263606

? ? ? 4:? ? 0.00157952

? ? ? 5:? ? 0.00015795

? ? ? 6:? ? 0.00001316

? ? ? 7:? ? 0.00000094

? ? ? 8:? ? 0.00000006

簡單翻譯一下,就是 :

理想狀態下,在隨機哈希值的情況,對于loadfactor = 0.75 ,雖然由于粒度調整會產生較大的方差,桶中的Node的分布頻率服從參數為0.5的泊松分布。?

(泊松分布算是我在這個沒什么意思的探討中學到的新的知識點吧,比較通俗易懂的解釋在這里


在上面給出的結果中,t=1,λ=0.5,推算得各種結果。這個我自己寫程序實現了一下,沒錯。但這個地方跟0.75沒關系,實際上是在JDK1.8中,如果鏈表的長度大于8,那么鏈表轉為紅黑樹 這個操作得來的。


那么,回到問題,0.75是怎么得來的呢?StackOverFlow上有這么一個回答我覺得可以給我結案了:

原鏈接如下:What is the significance of load factor in HashMap?

這個回答的釋義是: 一個bucket空和非空的概率為0.5,通過牛頓二項式等數學計算,得到這個loadfactor的值為log(2),約等于0.693. 同回答者所說,可能小于0.75 大于等于log(2)的factor都能提供更好的性能,0.75這個數說不定是 pulled out of a hat。

==========================

昨天和我學金融的著重號朋友討論這個問題,最后她說


其實我就是不喜歡面試官陰陽怪氣地說一句“這都背下來了”,你說你考我問題,又覺得我是背的,那你期待我怎么表現??回答不上來?哎,過去就過去了。

總結一下:

為什么是0.75? 這個我沒找到一個肯定完整的答案,這個問題比較偏,問到的幾率很小。但經過探討,你可以回答

1. 取 0.5和1 的缺點是什么, 同時說一下上面第一段引用的JDK API,就說API中也沒有說為什么取0.75.

2. 對方如果是個杠精,你可以深入理解一下stackoverflow中的這個計算,然后告訴他。 如果對方考你高數……我也沒辦法了,記得來我這里領一個愛的抱抱。


============================

學到了什么:?

1. 泊松分布和指數分布,順便回想一下正態分布

2. 氣場不和的面試官要用正確的心態去面對。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容