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元素时,扩容,可能会出现链表闭环

 

 

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