JDK7 與 JDK8 中HashMap 的實現

2021-09-19 05:10:00 字數 1173 閱讀 9019

hashmap 底層維護乙個資料,陣列中存放的是 entry。

map中的key,value則以entry的形式存放在陣列中。

static

class

entry

implements

map.entry

通過計算 key 的 hash 值來決定放在陣列的哪個位置,當 hash 值衝突時,用鍊錶的方式來儲存。

陣列擴容是原來的一倍。

如果 key 為 null,會將這個元素存放到 table[0] 的位置。

jdk8 採用的是陣列+鍊錶/紅黑樹的方式,當鍊表的長度大於某個閾值(預設是8)時,會將鍊錶轉化成紅黑樹。紅黑樹的查詢資料遠大於鍊錶。

jdk8中,當同乙個hash值的節點數不小於8時,將不再以單鏈表的形式儲存了,會被調整成一顆紅黑樹。這就是jdk7與jdk8中hashmap實現的最大區別。

jdk中entry的名字變成了node,原因是和紅黑樹的實現treenode相關聯。

原始碼解析:

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;}}

if(e != null)

}++modcount;if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

參考:

JDK7與JDK8中HashMap的實現的區別

hashmap底層維護乙個陣列,陣列中的每一項都是乙個entry transient entry table 我們向 hashmap 中所放置的物件實際上是儲存在該陣列當中 而map中的key,value則以entry的形式存放在陣列中 static class entryimplements ma...

JDK7 與 JDK8 中 HashMap 的實現

jdk7中的hashmap hashmap底層維護乙個陣列,陣列中的每一項都是乙個entry transient entry table 我們向 hashmap 中所放置的物件實際上是儲存在該陣列當中 而map中的key,value則以entry的形式存放在陣列中 static class entr...

JDK7 與 JDK8 中 HashMap 的實現

jdk7中的hashmap hashmap底層維護乙個陣列,陣列中的每一項都是乙個entry transient entry table 我們向 hashmap 中所放置的物件實際上是儲存在該陣列當中 而map中的key,value則以entry的形式存放在陣列中 static class entr...