HashMap基本結構

一、結構

  • 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%的時候會進行擴容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章