天天看點

HashMap1.8源碼分析2---擴容

前面章節講到了HashMap的put流程

https://blog.csdn.net/xingyuxinmeng_sky/article/details/92616167

這一節主要講resize擴容。

當桶的大小不足以容納目前資料,就要擴容。

HashMap1.8源碼分析2---擴容
HashMap1.8源碼分析2---擴容

數組長度變為原來的2倍,一系列校驗通過後,開始對原有資料進行拆分。

循環數組,每次得到頭結點,判斷是什麼結構,如果隻有一個節點,直接計算新的下标就可以了,如果是樹,就要對樹進行拆分,

否則就是一個連結清單,這裡詳細解釋連結清單的rehash過程,紅黑樹還是放到後面章節講。

循環連結清單,判斷e.hash & oldCap的值。

e.hash是一個int值,oldCap是一個2的幂

HashMap1.8源碼分析2---擴容

對任意值和2的幂做按位與運算,其結果要麼是0,要麼是oldCap。

HashMap1.8源碼分析2---擴容

這裡還有一點需要注意

Node<K,V> loHead = null, loTail = null;

Node<K,V> hiHead = null, hiTail = null;

這四個變量記錄了新舊的連結清單頭尾節點,目的是為了保證擴容後連結清單原有節點的順序不變。