Java中的map

Map散列表

hashmap1.7與1.8

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的數組的索引範圍。

map-1

4.因爲是1.8的HashMap,當鏈表的長度達到8個時,就會轉化爲紅黑樹進行存儲,這樣搜索效率就會達到Olog~2~N。

5.在get查找元素的時候,當計算好數組下標後,判斷如果該節點是Node(普通節點),就遍歷查找;如果是TreeNode,就使用紅黑樹的方式查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章