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

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值