hashMap擴容機制

2021-08-07 07:42:04 字數 998 閱讀 2606

擴容時空間大小變化:

hashmap中,雜湊桶陣列table的長度length大小必須為2的n次方(一定是合數),這是一種非常規的設計,常規的設計是把桶的大小設計為素數。相對來說素數導致衝突的概率要小於合數,具體證明可以參考       hashtable初始化桶大小為11,就是桶大小設計為素數的應用(hashtable擴容後不能保證還是素數)。

hashmap採用這種非常規設計,主要是為了在取模和擴容時做優化,同時為了減少衝突,hashmap定位雜湊桶索引位置時,也加入了高位參與運算的過程。

初始容量(預設)

最大容量

擴容時倍數

載入因子

hashtable

newcapacity=

(oldcapacity *2) + 1;

0.75

hashmap

2^42^30

*20.75

hashmap使用者自定義長度時,底層會設定長度為大於等於使用者提供數的2 的倍數;

擴容時資料的重新分布:

jdk1.8

當table需要擴容時,擴容後的table大小變為原來的兩倍,接下來就是進行擴容後table的調整:

假設擴容前的table大小為2的n次方,有put方法解析可知,元素的table索引為其hash值的後n位確定

那麼擴容後的table大小即為2的n+1次方,則其中元素的table索引為其hash值的後n+1位確定,比原來多了一位

因此,table中的元素只有兩種情況:

元素hash值第n+1位為0:不需要進行位置調整

元素hash值第n+1位為1:調整至原索引+n;

在resize方法中,第45行的判斷即用於確定元素hashi值第n+1位是否為0:

若為0,則使用lohead與lotail,將元素移至新table的原索引處

若不為0,則使用hihead與hihead,將元素移至新table的兩倍索引處

擴容或初始化完成後,resize方法返回新的table

HashMap擴容機制

當map元素容量超過設定的閾值threshold capacity loadfactor時進行擴容,如下圖所示 原理 建立更大容量的新陣列,重新計算每個元素在新陣列中的位置進行遷移。缺點 每個元素需要重新計算hash 鍊錶中元素順序每次遷移後被倒置 原理 在擴充hashmap的時候,不需要像jdk1...

HashMap儲存機制及擴容

首先要說的是hashmap的底層資料結構是陣列 鍊錶的結構。hashmap中有乙個entry內部類,內部類有幾個屬性 key,value,hash,next。hashmap中的陣列其實也就是entry陣列。hashmap的初始容量是16,如果賦值初始容量的話,也是會自動變成2的冪這種大小的。為什麼需...

HashMap擴容機制之雜談

1 hashmap的rehash將明顯耗效能,所以需要盡量避免rehash操作,我們需要做的是夠控制好預設初容量大小capacity和載入因子factory 即是hashmap中hash表中元素填滿的程度 比如可根據業務來定義,我們知道hashmap中的key和value大概可以存一w對以上,但是我...