Java HashMap结构和原理

扶醉桌前 提交于 2020-11-30 12:04:01

结构:

数组+链表 +(>=1.8)红黑树

插入过程:

根据拿到key得hash值(并非直接拿hashCode,而是拿它的高位和低位进行重新计算得出全新的hash值,目的是为了减少hash碰撞),拿hash值根据数组长度-1(默认16)去得到数组索引。

当他拿到索引后会判断当前位置是否为空,为空则放入,不为空则找next,next不为空继续找next。假如放完元素后,该链表长度>8并且数组长度>=64 那么转红黑树

hash碰撞的本质只是数组索引一样之后的处理

扩容:

当hashMap的元素数量 >= 数组长度*0.75,那么进行扩容原长度2倍(红黑树转链表是在扩容中进行的,并非在删除中,只判断长度<=6转链表,不判断64)。

线程不安全的原因:多个线程同时put元素时,扩容,可能会出现链表闭环

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!