Java并发编程78讲--31 第31讲:为什么 Map 桶中超过 8 个才转为红黑树?

本节探讨Java HashMap和ConcurrentHashMap在元素达到8个时转换为红黑树的原因。这源于平衡查找性能与空间消耗的考量。当链表长度超过8并满足容量条件时,转变为红黑树以维持O(log(n))的查找复杂度。不过,如果哈希算法不佳,可能导致链表异常增长,这时红黑树作为保底策略确保效率。若发现红黑树结构,应检查自定义哈希算法是否引起冲突。
摘要由CSDN通过智能技术生成

这一课时我们主要讲解为什么 Map 的桶中超过 8 个才转为红黑树?

JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点:最开始的 Map 是空的,因为里面没有任何元素,往里放元素时会计算 hash 值,计算之后,第 1 个 value 会首先占用一个桶(也称为槽点)位置,后续如果经过计算发现需要落到同一个桶中,那么便会使用链表的形式往后延长,俗称“拉链法”,如图所示:

图中,有的桶是空的, 比如第 4 个;有的只有一个元素,比如 1、3、6;有的就是刚才说的拉链法,比如第 2 和第 5 个桶。

当链表长度大于或等于阈值(默认为 8)的时候,如果同时还满足容量大于或等于 MIN_TREEIFY_CAPACITY(默认为 64)的要求,就会把链表转换为红黑树。同样,后续如果由于删除或者其他原因调整了大小,当红黑树的节点小于或等于 6 个以后,又会恢复为链表形态。

让我们回顾一下 HashMap 的结构示意图:

在图中我们可以看到,有一些槽点是空的,有一些是拉链,有一些是红黑树。

更多的时候我们会关注,为何转为红黑树以及红黑树的一些特点,可是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值