HashMap通過resize()方法進行擴容。
源碼解析:



resize()函數有兩種使用情況:
一、當table數組為null時初始化hash表。

二、當table數組不為null時進行擴容。
1、如果table數組的容量超過最大容量時,無法擴容,直接返回舊的數組。並將threshold值設置為Integer.MAX_VALUE(2^31-1),
2、如果table數組的容量擴展為原來的2倍時仍沒有超過最大容量且table數組原來的長度已經大於默認的初始容量時,將threshold擴大為原來的2倍。
3、將舊數組中的節點轉移到新的數組中去
1)、如果舊數組中的頭節點不為null且頭節點沒有下一個節點,則先將舊數組置空,再計算該節點在新數組的索引,最后將該節點放到新數組的該索引位置處
2)、如果舊數組中的頭節點為樹節點,則按樹節點的方式處理。
3)、如果舊數組中的頭節點有下一個節點,則將下一個節點賦值給next,經過觀測可以發現,我們使用的是2次冪的擴展(指長度擴為原來2倍),所以,元素的位置要么是在原位置,要么是在原位置再移動2次冪的位置。當將該頭節點放到新數組時的索引位置等於其在舊數組的索引位置,如果尾節點為null,則將e賦值給頭節點,,並將e賦值給尾節點.;如果尾節點不為null,則將e賦值給尾節點的下一個節點,並將e賦值給尾節點。如果尾節點不為null,則將尾節點的next屬性置為null,再將頭節點賦值給新數組的索引位置。
當將該頭節點放到新數組時的索引位置等於其在舊數組的索引位置再加上舊數組的長度,如果尾節點為null,則將e賦值給頭節點,,並將e賦值給尾節點.;如果尾節點不為null,則將e賦值給尾節點的下一個節點,並將e賦值給尾節點。如果尾節點不為null,則將尾節點的next屬性置為null,再將頭節點賦值給新數組的索引位置(就數組的索引位置+舊數組的長度)。
