HashMap

HashMap

HashMap1.7

HashMap1.7以数组加链表的形式存储元素,先根据key模除计算出hash值,放在对应数组下标的位置,如果发生hash冲突,以链表的形式存储。

HashMap1.8

HashMap1.8以数组加链表加红黑树的形式存储元素,对key做与运算计算出hash值,放在对应数组下标的位置,如果链表的长度大于8,先判断HashMap大小是否大于64,小于64优先扩容,大于64链表转红黑树。

HashMap1.7扩容

HashMap1.7使用头插法,并发扩容可能会死锁。两个线程同时扩容,每个线程都有一组指针指向要转移的元素,线程1转移元素后,元素的上下位置调换。线程2指针还是指向原来的元素,但是位置已经变了,下面的元素本身指向上面的元素,现在上面的元素指向下面的元素,就形成环死锁。

HashMap1.8扩容

hashmap1.8扩容优化,元素迁移不需要rehash,使用两组指针区分高低位(&老数组长度)结果为0或非0,结果0转移到新数组的原位置,结果非0转移到原数组位置+老数组大小的位置

负载因子0.75

负载因子0.75(数组一半以上位置有值),在空间和性能上做平衡,根据牛顿二项式得出结果0.7

为什么是2的次幂

1.8作hash运算使用&length-1,因为2的幂-1都是11111结尾的,和模除结果是一样的,碰撞几率小。使Hash算法的结果均匀分布。

CurrentHashMap

使用了分段锁,细化锁力度,提升性能。
当一个线程对CurrentHashMap扩容时,如果是正在扩容中,会帮助完成CurrentHashMap的扩容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值