環境: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它是怎麼玩的吧。首先我們看下新陣列長度和新陣列擴容閾值是怎麼算出來...