其實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...