今天了聊聊jdk1 8 HashMap的擴容原理

2021-10-07 15:15:06 字數 1209 閱讀 9379

其實hashmap已經是乙個老生常談的問題了在面試中也是深受面試官喜愛,在網上如果搜尋hashmap原理,原始碼分析得文章也是非常多本文基於jdk1.8分析下擴容原理

jdk1.7與jdk1.8最大的差別是解決hash衝突的資料結構由原來的鍊錶變為鍊錶+紅黑樹

首先翻一下該方法注釋,翻譯出來感覺還是很拗口

初始化或者將table長度變為原來的2倍  

如果為空,則根據字段閾值中保留的初始容量目標進行分配。

否則的話由於通過double原來table方式進行擴充套件,如果hash桶在原表的位置為index,那麼擴容後在新錶的索引要麼與index相同要麼在index+老table的長度的位置

由於resize方法比較長因此分割成幾個**片段進行分析

hashmap map = new hashmap(9);

hashmap map = new hashmap();

final node resize() 

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

newthr = oldthr << 1; // double threshold

}else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

if (newthr == 0)

threshold = newthr;

....省略部分**

}

final node resize() 

else

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

if (lotail != null)

if (hitail != null) }}

}}return newtab;

}

關於hash表長度嚴格為2的冪次通過上述的操作應該可以發現在兩個地方非常有

JDK 1 8 HashMap擴容原理

擴容前計算索引 1010 0101 0000 1111 0000 0101 索引結果 5擴容以後容量是n 32 對應的二進位制是0001 1111 node本身的hash值是不變的,仍然是1010 0101,那麼擴容後node 的索引的計算是通過如下方式得到 擴容後計算索引 1010 0101 00...

JDK1 8 HashMap原始碼解析

普通常量 儲存node鍊錶的陣列 transient node table 由node節點構成的set集合 transient set entryset hashmap儲存元素的數量 transient int size 記錄hashmap結構性變化的次數 value覆蓋不算 和fail fast機...

JDK 1 8 HashMap原始碼解析

put方法分析 public v put k key,v value hash方法解析 減少hash衝突 static final int hash object key putval方法具體實現 final v putval int hash,k key,v value,boolean onlyi...