HashMap的底層原理及擴容過程

2022-05-22 13:15:09 字數 2408 閱讀 3277

initialcapacity    預設初始容量   值為16,最大容量值為2^30

loadfactor 預設載入因子 值為0.75f

threshold 閾值 預設值為16 *0.75 ,即容量*載入因子

這兩個引數是影響hashmap效能的重要引數,其中容量表示雜湊表中桶的數量,初始容量是建立雜湊表時的容量,

載入因子是雜湊表在其容量自動增加之前可以達到多滿的一種尺度,它衡量的是乙個雜湊表的空間的使用程度,載入因子越大表示雜湊表的裝填程度越高,反之愈小。

如果載入因子越大,對空間的利用更充分,然而後果是查詢效率的降低;如果載入因子太小,那麼雜湊表的資料將過於稀疏,對空間造成嚴重浪費。系統預設負載因子為0.75,一般情況下無需修改。

在jdk1.7中,hashmap的底層建立的是entry陣列,在例項化後,底層就建立了乙個長度為16的entry陣列,此時的底層結構是陣列+鍊錶;在jdk1.8中,底層建立的是node陣列,底層在一開始並不會建立陣列,在第一次呼叫put方法時,底層才會建立乙個長度為16的node陣列,此時的底層結構是陣列+鍊錶+紅黑樹。

hashmap使用的是懶載入,構造完hashmap物件後,只要不進行put 方法插入元素,hashmap並不會去初始化或者擴容table。

當首次呼叫put方法時,hashmap會發現table為空然後呼叫resize方法進行初始化。

public v put(k key, v value) 

final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

當新增完元素後,如果hashmap發現size(元素總數)大於threshold(閾值),則會呼叫resize方法進行擴容,然後把擴容後的陣列放到新的陣列中去。

若threshold(閾值)不為空,table的首次初始化大小為閾值,否則初始化為預設值大小16。

當table需要擴容時,擴容後的table大小變為原來的兩倍,接下來就是進行擴容後table的調整:

假設擴容前的table大小為2的n次方,有put方法可知,元素的table索引為其hash值的後n位確定

那麼擴容後的table大小即為2的n+1次方,則其中元素的table索引為其hash值的後n+1位確定,比原來多了一位

因此,table中的元素只有兩種情況:

元素hash值第n+1位為0:不需要進行位置調整

元素hash值第n+1位為1:調整至原索引的兩倍位置

在resize方法中,第45行的判斷即用於確定元素hashi值第n+1位是否為0:

擴容或初始化完成後,resize方法返回新的table。

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;

@suppresswarnings()

node newtab = (node)new node[newcap];

table = newtab;

if (oldtab != null)

else

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

if (lotail != null)

if (hitail != null) }}

}}

return newtab;

}

HashMap底層實現原理 擴容機制

hashmap基於map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null 值,因為key不允許重複,因此只能有乙個鍵為null,另外hashmap不能保證放入元素的順序,它是無序的,和放入的順序並不能相同。hashmap的容量,預設是16 the default initial ...

HashMap底層原理

1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...

HashMap底層原理

hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...