[面试|HashMap|红黑树] 转载:HashMap到8时转为红黑树到6转为链表 原因详解

HashMap在链表长度达到8时转为红黑树,元素总数达到64时触发。红黑树在元素数量小于6时退化回链表。扩容条件是元素数量超过桶长度的0.75倍。链表转红黑树阈值8是基于概率统计的时间和空间权衡。转化阈值不同是为了避免频繁转化操作。

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

来源:HashMap到8时转为红黑树到6转为链表 原因详解

在这里插入图片描述
HashMap的初始长度是16,每次扩容时都会在原始的长度上翻倍(size × 2),所以长度一定是2的n次方。

红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。

红黑树退哈成链表: 红黑树中元素的数量小于6。

哈希桶扩容的条件:元素数量 >= 长度(16)× 加载因子(0.75)

扩容时,需重新计算桶中每一个位置的内容:

如果原桶内容为空,则直接复制过去;

当桶位置连有链表时,则计算出该链表的低位链和高位链,如果是低位链则直接复制到原索引位置,如果是高位链,则复制到(原索引 + 原长度)的位置(新索引),桶位置是红黑树时,同理,因为树种有退化成链表时需要的节点地址值,所以红黑树同样可计算出该树的低位链和高位链。

链表转换成红黑树的阈值为什么是 8 ,而加载因子为什么是0.75?

在hashCode离散性很好的情况下,红黑树用到的概率非常小,因为数据均匀分布在每个桶中,几乎不会有桶中链表长度会达到阈值(8)。但是在随机hashCode下,离散性可能会变差,然而JDK又不能阻止用户实现这种不好的hash算法,因此就可能导致不均匀的数据分布。
事实上,随机hashCode算法下所有桶中节点的分布频率遵循如下的泊松分布。在扩容阈值为0.75的情况下,(即使因为扩容而方差很大)遵循着参数平均为0.5的泊松分布。一个桶中链表长度达到8个元素的概率为0.00000006,几乎是不可能事件。之所以选择8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢前端的后端MelodyJerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值