HashMap幾個須要注意的知識點

HashMap簡介
HashMap 是java集合框架的一部分。
  • key value都容許null值 (除了非同步和容許使用 null 以外,HashMap 類與 Hashtable 大體相同)
  • 不保證映射的順序,先存入的數據取出來的時候不必定是先取出的
  • 迭代 collection 視圖所需的時間與 HashMap 實例的「容量」(桶的數量)及其大小(鍵-值映射關係數)成比例。因此,若是迭代性能很重要,則不要將初始容量設置得過高(或將加載因子設置得過低)
  • HashMap 的實例有兩個參數影響其性能:初始容量 和加載因子。默認初始容量是16,默認加載因子是0.75.
  • 由全部此類的「collection 視圖方法」所返回的迭代器都是快速失敗 的。除非經過迭代器自己的 remove 方法,其餘任什麼時候間任何方式的修改,迭代器都將拋出  ConcurrentModificationException
 
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在併發的狀況下可能會造成鏈表環。
  具體狀況能夠查看 這篇博客
相關文章
相關標籤/搜索