HashMap底層實現原理

2022-08-13 12:36:20 字數 1064 閱讀 3015

一、jdk1.7中hashmap的底層實現原理

首先,當我們通過hashmap的構造方法建立乙個hashmap物件時,底層就會建立乙個entry型別的一維陣列(預設初始化長度為16)。當我們執行put操作的時候,會呼叫key所屬類的hashcode方法計算出key的hash值,然後將hash值通過雜湊函式計算出更加複雜的hash值,再將算出的hash值和陣列長度進行&運算(位運算的一種),獲得當前put進來的資料要在entry陣列中存放的位置。然後就去陣列上找這個位置,此時有兩種情況:

一是該陣列位置上是空的,此時直接將put進來的鍵值對存放在陣列的該位置上。

二是該陣列位置上不為空(說明此位置上已經存放了乙個或多個元素,通過鍊錶的方式),已經有元素了(這種現象稱為雜湊衝突,即雜湊函式算出來的位址被別的元素占用了)。此時就需要將put進來的key的雜湊值和該位置上存放的所有元素的key的雜湊值逐一進行比較。這裡又有兩種情況:

1.雜湊值都不同:此時就可以認為put進來的鍵值對是乙個新的元素,繼續以鍊錶的形式儲存。

2.雜湊值相同:注意,雜湊值相同並不能就確定他們是相同的物件,還需要呼叫他們的key中的equals方法進一步進行比較,這裡又有兩種情況

a.兩個key進行equals後返回true,則證明這兩個key是相同的。map不允許儲存相同的key,於是會把原來的value,替換為put進來的value值。

b.兩個key進行equals後返回false,則證明這兩個key是不同的,繼續以鍊錶的形式儲存put進來的鍵值對。

二、jdk1.8中hashmap的底層實現原理

jdk1.8中hashmap的底層實現與jdk1.7基本一樣,但是有少許變化,下邊只講變化的地方。

1.jdk7中,鍵值對會被封裝為entry物件,而jdk8是封裝為node物件。

2.jdk7中 陣列在呼叫hashmap的構造方法時建立,而jdk8中陣列建立是在第一次呼叫put方法。

3.jdk7底層結構只有:陣列+鍊錶。jk8中底層結構:陣列+鍊錶+紅黑樹

拓展:紅黑樹什麼時候被使用?

當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數》8且當前陣列的長度》64時,此時此素引位置上的所有資料改為使用紅黑樹儲存

hashmap底層實現原理

每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...

HashMap底層實現原理

hashmap map new hashmap 在例項化以後,底層建立了長度為16的一維陣列entry table 已經執行過put操作.map.put key1 value1 呼叫key1所在類的hashcode 計算key1雜湊值,此雜湊值經過某種演算法計算後,得到在entry陣列中的存放位置 ...

HashMap的底層實現原理

hashmap的底層是通過陣列 鍊錶 即雜湊表 的結構來實現的。hashmap的例項有兩個引數影響其效能 初始容量和載入因子。初始容量只是雜湊表在建立時的容量,載入因子是雜湊表在其容量自動增加之前可以達到多滿的一種尺度。當雜湊表中的條目超出了載入因子與當前容量的乘積時,通過呼叫rehash方法將容量...