Java HashMap結構和原理

結構:

數組+鏈表 +(>=1.8)紅黑樹

插入過程:

根據拿到key得hash值(並非直接拿hashCode,而是拿它的高位和低位進行重新計算得出全新的hash值,目的是爲了減少hash碰撞),拿hash值根據數組長度-1(默認16)去得到數組索引。

當他拿到索引後會判斷當前位置是否爲空,爲空則放入,不爲空則找next,next不爲空繼續找next。假如放完元素後,該鏈表長度>8並且數組長度>=64 那麼轉紅黑樹

hash碰撞的本質只是數組索引一樣之後的處理

擴容:

當hashMap的元素數量 >= 數組長度*0.75,那麼進行擴容原長度2倍(紅黑樹轉鏈表是在擴容中進行的,並非在刪除中,只判斷長度<=6轉鏈表,不判斷64)。

線程不安全的原因:多個線程同時put元素時,擴容,可能會出現鏈表閉環

 

 

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