HashMap的擴容因子爲什麼是0.75

最近在看HashMap源碼,對於擴容因子=0.75感到很費解,爲什麼在用了75%的容量的時候就要進行擴容呢?數組中明明還有25%的空間沒有使用。爲什麼不等到數組幾乎滿了(擴容因子=0.95)的時候才進行擴容?擴容因子=0.95和擴容因子=0.75有什麼區別嗎?
首先來看一下什麼是擴容因子。假設hash函數是理想的,數據會通過hash函數均勻的映射到數組上。一個數據映射到每一個桶(bucket)的概率是相等的。那麼在任意的數組容量下,put一個數據發生碰撞的概率=數組中元素的個數數組容量 \frac{數組中元素的個數}{數組容量} 
數組容量
數組中元素的個數
​    
 。而數組的擴容門檻threshold = capacity * loadFactorloadFactor。也就是說擴容因子就是HashMap在擴容門檻的狀態下,put操作發生碰撞的概率。
那麼,擴容因子等於0.75還是0.95的區別就很明顯了。擴容因子=0.75。當使用量接近數組容量的75%的時候,數組中還有25%的剩餘空間。平均來看,就是每4個桶(bucket)中還有一個是空的,當我們向map中put數據的時候,發生碰撞的概率是75%。因爲這25%的空閒空間的存在,發生hash碰撞的概率還處在一個可以接受的範圍內。
而當擴容因子=0.95的時候,平均來看,就是每20個桶(bucket)中才有一個是空的,此時數組中幾乎沒有空閒的桶(bucket),當我們put數據的時候,碰撞的概率是95%,幾乎可以認爲會發生碰撞。
除此之外,碰撞的概率越大,put的元素就越多,平均到每個桶中的元素的數量也越多。一旦發生碰撞,需要付出更大的代價。所以,如果擴容因子越大,碰撞的概率也就越大,發生碰撞後的代價也更大,結果導致效率大打折扣。
因此擴容因子=0.75也是一個空間換時間的考慮,0.75這個數值應該是經過充分的考慮決定的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章