【面試】HashMap

1、HashMap的繼承關係

 2、基本屬性:

  • 非線程安全
  • 初始容量16,加載因子0.75,擴容爲原來的2倍
  • key可以存null,但智能存一個,value可以存null,可以有多個
  • 1.8前數組+鏈表,1.8後數組+鏈表+紅黑樹,桶內的節點個數>8後執行treeifyBin方法,判斷長度是否大於最小紅黑樹容量64,小於擴容,大於則進行樹化
  • 擴容是2的倍數

3、JDK8中的HashMap有哪些改動?

  • JDK7中的底層實現是數組+鏈表,JDK8中使用的是數組+鏈表+紅黑樹。
  • JDK7中擴容時有可能出現死鎖,JDK8中通過算法優化不會出現死鎖了。
  • JDK8中對算哈希值的哈希算法進行了簡化以提高運算效率

4、JDK8中爲什麼要使用紅黑樹?

數據量特別大的時候會產生hash碰撞,導致某個鏈表數據量特別大,鏈表的查找速度比較慢複雜度是O(n),影響比較差;因此優化成節點數量>8時轉化成紅黑樹,查找的時間複雜度爲O(logn)

5、HashMap的put流程

 

6、get流程

 

7、擴容 

 

8、爲什麼以2的倍數進行擴容?

 降低發生碰撞的概率,使散列更均勻。根據key的hash值計算bucket的下標位置時,爲了得到這個索引值必須對擾動後的數跟數組長度進行取餘運算,即 hash % n (n爲hashmap的長度),又因爲&比%運算快,n如果爲2的倍數,就可以將%轉換爲&,結果就是 hash & (n-1),所以HashMap長度是2的倍數

 

Map的遍歷方式

 

 

參考:

hashmap面試

 

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