結構:
數組+鏈表 +(>=1.8)紅黑樹
插入過程:
根據拿到key得hash值(並非直接拿hashCode,而是拿它的高位和低位進行重新計算得出全新的hash值,目的是爲了減少hash碰撞),拿hash值根據數組長度-1(默認16)去得到數組索引。
當他拿到索引後會判斷當前位置是否爲空,爲空則放入,不爲空則找next,next不爲空繼續找next。假如放完元素後,該鏈表長度>8並且數組長度>=64 那麼轉紅黑樹。
hash碰撞的本質只是數組索引一樣之後的處理
擴容:
當hashMap的元素數量 >= 數組長度*0.75,那麼進行擴容原長度2倍(紅黑樹轉鏈表是在擴容中進行的,並非在刪除中,只判斷長度<=6轉鏈表,不判斷64)。
線程不安全的原因:多個線程同時put元素時,擴容,可能會出現鏈表閉環