Map散列表
JDK1.8的HashMap
因爲現在都用1.8了,所以還是以1.8的爲準。
關於HashMap以及ConcurrentHashMap,網上的分析已經很透徹了。這裏就提幾個點吧。
1.關於容量,HashMap的容量最小是16,每次擴容都是2的倍數,這是有原因的。也就是說:
new HashMap<>(14)
生成的map容量是16,new HashMap<>(24)
生成的map容量是32。
2.負載因子loadFactor
是0.75,也就是4分之3。當放入map的元素達到capacity * loadFactor
時,就要進行擴容操作。假設我們初始化的容量是16,那麼放入第12個元素時,就會進行擴容操作,變成32容量。
3.散列表的結構,我們需要提及一下元素put的時候如何決定放入數組的哪個格子裏?如下圖,索引值=(n-1) & hash
,n是map的大小。當map大小爲16時,那麼n-1
的二進制就是000...001111
(前面都爲0,末4位爲1);那麼與hash值相與,結果就=000...00xxxx
,即後4位由hash值所決定,hash值原來的後4位是什麼就是什麼,這樣最後的結果就處於0~15之間了,正好對應大小爲16的數組的索引範圍。
4.因爲是1.8的HashMap,當鏈表的長度達到8個時,就會轉化爲紅黑樹進行存儲,這樣搜索效率就會達到Olog~2~N。
5.在get查找元素的時候,當計算好數組下標後,判斷如果該節點是Node
(普通節點),就遍歷查找;如果是TreeNode
,就使用紅黑樹的方式查找。