Java集合:HashMap二次hash | 扩容机制 | 并发死链

Java中的HashMap利用二次哈希解决哈希冲突,每个桶为链表或红黑树。当元素数量超过负载因子与容量的乘积时,HashMap会扩容,可能导致并发问题如死链。文章讨论了HashMap如何通过二次哈希和扩容策略提高性能及处理并发时的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二次Hash

Java中的HashMap使用了二次hash来解决哈希冲突的问题。哈希冲突是指不同的键值对可能会被映射到同一个桶中,这会导致查找效率降低。

为了解决这个问题,HashMap使用了二次hash算法来重新计算哈希值,从而将键值对分散到不同的桶中。 具体来说,HashMap中每个桶都是一个链表,当发生哈希冲突时,新的键值对会被插入到链表的头部。当链表长度超过一定阈值时,链表会被转换为红黑树,以提高查找效率。

而二次hash算法则是在计算哈希值时,使用了两个不同的哈希函数,以增加哈希值的随机性,从而减少哈希冲突的概率。 因此,HashMap中的二次hash算法可以提高哈希表的性能和效率,使得查找、插入和删除操作更加快速和稳定。

扩容机制

HashMap的扩容机制是指当HashMap中的元素数量超过了负载因子(load factor)与容量(capacity)的乘积时,就会自动扩容,以保证HashMap的性能和效率,比如负载因子是0.7,容量是10,在元素数量达到8的时候就会触发扩容。

具体来说,当HashMap中的元素数量超过了负载因子与容量的乘积时,就会触发扩容操作。扩容操作会将HashMap的容量扩大一倍,并重新计算每个元素的哈希值和桶位置,然后将元素重新分配到新的桶中。

这个过程需要重新分配内存空间,并将原有的元素复制到新的内存空间中,因此会带来一定的性能开销。 在扩容过程中,HashMap会将原有的桶中的元素重新分配到新的桶中,这个过程可能会导致哈希冲突的发生。

为了解决这个问题,HashMap使用了二次hash算法来重新计算哈希值,从而将键值对分散到不同的桶中,以减少哈希冲突的概率。 总之,HashMap的扩容机制可以保证HashMap的性能和效率,并且通过二次hash算法来解决哈希冲突的问题。

并发死链

线程1刚刚记录完e=a,next=b,就发生了线程切换,换到了线程2执行

线程2完成了整套头插法扩容流程,此时线程1的扩容动作还没有执行,线程1需要继续刚才暂停的位置

线程1继续刚记录完的e=a,next=b,第一轮循环结束后e=b,此时线程2早已经把b的next值指向a,所以next值并没有指向null

第二轮循环结束,第三轮循环开始,此时线程1操作e拿到的next值是a,这就形成了b指向a,a指向b

虽然程序执行结束了,但在下一次查找这个链表a的时候,就会陷入死循环

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值