版本:JDK1.8。html
這裏把數組每一個元素稱爲桶
數組
- 使用數組+鏈表+紅黑樹:使用紅黑樹爲了解決鏈表過長致使性能降低的問題。鏈表大於8就會轉爲紅黑樹
- JDK1.8後,hashmap使用尾插法。新增的元素會放在
bucket
(桶)的最後面。
- 爲了解決頭插入法在多線程下可能出現環鏈表的問題。同時鏈表內元素順序保持不變
- 使用2的倍數做爲數組的大小:更加容易計算他們所在的桶
若是是2的倍數的話,更容易計算所在的桶。好比原來是4,擴展爲8多線程
-
在原來桶0的元素,會在新的桶0和4中源碼分析
-
在原來桶1的元素,會在新的桶1和5中性能
-
在原來桶2的元素,會在新的桶2和6中.net
-
在原來桶3的元素,會在新的桶3和7中線程
爲何會這樣呢?首先須要是將hash
值取餘獲得所在桶。code
原來通長度是4,取餘則是二進制後兩位。好比在桶0,後兩位必然是00
,桶1則是01
,桶2則是10
,桶3則是11
。對於長度爲8,則是3位,原來桶0的00
將有兩種可能:000
和100
也就是桶0和桶4(原來桶位置 + 原來桶長度 = 0 + 4)。htm
參考:blog
-
關於JDK1.8 HashMap擴容部分源碼分析 :在resize擴容爲何會出現環鏈表