最近在看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這個數值應該是經過充分的考慮決定的。
HashMap的樹化因子為什麼是8
網上主流的答案 紅黑樹的平均查詢長度是log n 如果長度為8,平均查詢長度為log 8 3,鍊錶的平均查詢長度為n 2,當長度為8時,平均查詢長度為8 2 4,紅黑樹的查詢效率更高,這才有轉換成樹的必要 鍊錶長度如果是小於等於6,6 2 3,而log 6 2.6,雖然速度也很快的,但是轉化為樹結構...
HashMap的負載因子為什麼不設定成1
為什麼hashmap的負載因子設定成0.75,而不是1也不是0.5?這背後到底有什麼考慮?在hashmap原始碼中 hashmap預設容量大小是16,最大容量是2的30次方,預設的負載因子是0.75f static final int default initial capacity 1 4 aka...
HashMap的負載因子
下面是hashmap的乙個建構函式,兩個引數initialcapacity,loadfactor 這關係hashmap的迭代效能。constructs an empty hashmap with the specified initial capacity and load factor.param...