HashMap簡介
HashMap 是java集合框架的一部分。
-
key value都容許null值 (除了非同步和容許使用 null 以外,HashMap 類與 Hashtable 大體相同)
-
不保證映射的順序,先存入的數據取出來的時候不必定是先取出的
-
迭代 collection 視圖所需的時間與 HashMap 實例的「容量」(桶的數量)及其大小(鍵-值映射關係數)成比例。因此,若是迭代性能很重要,則不要將初始容量設置得過高(或將加載因子設置得過低)
-
HashMap 的實例有兩個參數影響其性能:初始容量 和加載因子。默認初始容量是16,默認加載因子是0.75.
-
Q1:HashMap 在1.8 後底層實現原理的變化
在jdk8中,HashMap處理「碰撞」增長了紅黑樹這種數據結構,當碰撞結點較少時,採用鏈表存儲,當較大時(>8個),採用紅黑樹(特色是查詢時間是O(logn))存儲(有一個閥值控制,大於閥值(8個),將鏈表存儲轉換成紅黑樹存儲)
Q2:爲何HashMap的容量老是2的倍數?
初始化時候
Q3:HashMap 是如何實現散列的?
Q4:HashMap什麼狀況下衝突解決方式由拉鍊法變成紅黑樹方式?
當鏈表長度>= 7的時候
Q5:HashMap是如何實現擴容的?
Q6:HashMap在高併發下若是沒有處理線程安全會有怎樣的安全隱患,具體表現是什麼?
Hashmap在插入元素過多的時候須要進行Resize, Resize的條件是 HashMap.Size >= Capacity * LoadFactor。
Hashmap的Resize包含擴容和ReHash兩個步驟,ReHash在併發的狀況下可能會造成鏈表環。