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的遍歷方式
參考: