HashMap原始碼 擴容resize方法

2021-08-20 08:06:46 字數 1159 閱讀 9520

環境:jdk1.8

resize方法原始碼如下:

final node resize() 

//初始化新容量值為舊容量值的2倍,然後與最大容量值比較,當新容量值小於最大容量值,且舊容量值大於等於預設初始化容量值,這時也對新閾值賦值為舊閾值的2倍

else if ((newcap = oldcap << 1) < maximum_capacity && oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}//2.這裡的前提條件是oldcap=0,說明這是第一次建立表,將對新容量賦值為舊閾值,這裡舊閾值其實就等於hashmap的初始化容量值

else if (oldthr > 0)

newcap = oldthr;

//3.當oldcap=0且oldthr=0的情況下,我們預設對新容量值和新閾值按初始化值進行賦值

else

//當進入判斷條件2時,這時新閾值就會等於0

if (newthr == 0)

//修改全域性變數threshold的值

threshold = newthr;

//定義並初始化新錶,指定容量

@suppresswarnings()

node newtab = (node)new node[newcap];

//修改全域性變數table的值

table = newtab;

//判斷舊表是否存在,如果存在,則需要將舊表中的資料複製到新錶中

if (oldtab != null)

else

} while ((e = next) != null);

//雜湊不衝突的元素放入新錶與舊表一樣的位置上

if (lotail != null)

//雜湊衝突的元素提取出來,放入新位置上

if (hitail != null) }}

}}

return newtab;

}

總結:

1、擴容操作首先主要的操作是給新錶的容量以及閾值正確賦值

2、建立新錶後,要判斷節點元素是紅黑樹還是鍊錶,分別做不同的處理

3、處理鍊錶元素時要注意雜湊衝突的元素要單獨提取出來儲存

Java原始碼解析HashMap的resize函式

hashmap的resize函式,用於對hashmap初始化或者擴容。首先看一下該函式的注釋,如下圖。從注釋中可以看到,該函式的作用是初始化或者使table的size翻倍。如果table是null,那麼就申請空間進行初始化。否則,因為我們在使用2的指數的擴張,在原來table的每個位置的元素,在新的...

原始碼擴容及HashMap樹化

對於hashmap初始容量為16 負載因子為0.75 最小樹化長度為64 當前鍊錶的長度大於8時進行樹化,轉化為紅黑樹,進入樹化方法則會發現,樹化之前會先進性判斷,陣列的長度如果小於64則會先進行擴容。擴容的方式就是建立新的陣列 陣列長度並不能變 將老元素重新新增到新的陣列中。for int bin...

原始碼解析 HashMap擴容 紅黑樹單獨講

1.擴容的方法如下,主要幹這幾件事情,第一件,算出新陣列長度和新陣列擴容閾值,建立新陣列。第二件,擴容前的陣列元素遷移到擴容後的陣列當中去。主要分為單個元素的遷移,鍊錶的遷移,紅黑樹的遷移 下期再講 下面我們依次來看一下hashmap它是怎麼玩的吧。首先我們看下新陣列長度和新陣列擴容閾值是怎麼算出來...