一、結構
- hashMap採用鍵值對存儲,底層使用數組額鏈表的結構。
- HashMap初始化容量是16,即初始化數組大小爲16,數組的每個位置都可以看個一個桶,每個桶存放一個鏈表Entry,Entry包含了四個字段,key、value、next和hash,採用拉鍊法解決衝突,如下圖所示:
- 拉鍊法,HashMap的put操作時,比如插入<K1, V1>時,先計算K1的hashCode = hash,hash與hashMap容量length - 1進行與運算得到元素放的位置在哪個桶,當有元素放入相同的桶時,鏈表下拉成爲鏈,如上圖位置標號爲5的桶。
- hashMap允許插入爲null的鍵值對,由於null無法調用hashCode()方法,所以hashMap強制使用第0個桶存放爲null的鍵值對。其中實現方法如下:
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
二、擴容
- 當存放鍵值對數量超過臨界值時,hashMap容量擴容爲原來的2倍,其中主要參數有:
- capacity :hashMap容量大小,初始默認值爲16;
- size:hashMap鍵值對數量;
- threshold:size臨界值,當size超過這個值時,觸發擴容;
- loadFactor:hashMap負載因子,容量所能使用的比例大小,hashMap默認值爲0.75,也就是當鍵值對超過總容量的75%的時候會進行擴容。