擴容時空間大小變化:
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對以上,但是我...