2.您可以存儲空鍵和空值。
?3.線性不安全感
?4.初始容量為16,擴展總是2的冪(保證位操作)。
?5.當加載因子為0.75時,當映射中的元素總數超過條目數組的0.75時,將觸發擴展操作。
?6.在並發的情況下,HashMap的put操作將導致無限循環,從而導致CPU利用率接近100%。
?(1)HashMap的底層數據結構是數組+鏈表的形式。在JDK8及以後的版本中,采用數組+鏈表+紅黑樹的方式來解決長鏈表導致的查詢速度慢的問題。
?(2)簡單來說,HashMap由數組和鏈表組成,數組是HashMap的主體,鏈表主要是為了解決哈希沖突而存在的。HashMap通過擾動函數處理後的key的HashCode獲取哈希值,然後通過bit運算判斷當前元素的存儲位置。如果當前位置有壹個元素,則判斷該元素與要存儲的元素的哈希值和鍵是否相同,如果相同,則直接覆蓋,如果不相同,則通過zipper方法解決沖突。當映射中的元素總數超過條目數組的0.75時,將觸發擴展操作。為了減少鏈表的長度,元素分布更加均勻。
DEFAULT_INITIAL_CAPACITY:默認初始化容量1
MAXIMUM_CAPACITY:最大容量1
?DEFAULT_LOAD_FACTOR:默認的加載因子,設計者認為這是基於時間和空間消耗的最佳值。這個值和容量的乘積是壹個非常重要的值,即閾值。當達到該值時,容量將擴大,大約是原來的兩倍。
TREEIFY_THRESHOLD:從jdk8開始,HashMap底層的存儲結構改為數組+鏈表+紅黑樹的存儲結構(之前是數組+鏈表)。首先,當存儲元素發生沖突時,壹個鏈表將被掛在發生沖突的數組後面。當鏈表的長度大於該參數時,鏈表可能被轉換為紅黑樹。為什麽可能後面有壹個參數,兩個都滿足才會轉換?
UNTREEIFY_THRESHOLD:引入上述參數時,我們知道當長度過大時,可能會有從鏈表到紅黑樹的轉換,但元素不僅可以添加還可以刪除,或者另壹種情況下,擴展後數組的槽位中沒有太多元素數據,使用紅黑樹的結構將非常浪費,那麽此時可以將紅黑樹結構改回鏈表結構,何時更改?也就是說,當元素數量等於該值(即6)時,它會變回來(元素數量是指數組槽中的數量,而不是HashMap中所有元素的數量)。
MIN_TREEIFY_CAPACITY:鏈表樹化的標準。如前所述,當數組槽中的元素數量大於8時,它可能會被轉換為紅黑樹。原因是當數組的長度小於該值時,它將首先被擴展。在擴展之後,很可能陣列插槽中的數據可以更加分散,因此無需在陣列插槽之後改造存儲結構。當然,當長度大於該值並且槽中的數據大於8時,它將被轉換為紅黑樹。