hashmap总结 -- 参考文章版

目录

底层原理

高并发下的hashmap

总结


底层原理:

https://zhuanlan.zhihu.com/p/78079598

1、底层原理:put、get;

2、为甚hashMap的长度要为2的幂次;


高并发下的hashmap:

https://zhuanlan.zhihu.com/p/81587796(解析详细)

1、Hashmap在插入元素过多的时候需要进行Resize,Resize的条件是

HashMap.Size >= Capacity * LoadFactor。

2、Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的情况下可能会形成链表环(本质是因为1.7版本put采用的头插法。因为作者考虑到后插入的元素更可能先被用到,头插就更方便get,提高效率,不过反而造成了线程不安全。)


总结

HashMap之所以在并发下的扩容造成死循环,是因为,多个线程并发进行时,因为一个线程先完成了扩容,将原的链表重新散列到自己的表中,并且链表变成了倒序,后一个线程再扩容时,又进行自己的散列,再次将倒序链表变为正序链表。于是形成了一个环形链表,当get的时候,造成死循环。

虽然在JDK1.8中,Java的开发小组修正了这个问题,但是HashMap始终存在着其他的线程安全问题。所以在并发情况下,我们应该使用HastTable或者ConcurrentHashMap来代替HashMap。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值