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...