链表长度≥8且数组长度≥64时HashMap才树化;否则优先扩容;节点≤6时退化为链表。阈值8基于泊松分布概率极低、红黑树查找优势显现及内存开销权衡确定。

链表长度达到 8 时,HashMap 才会考虑转成红黑树——但不是单看长度,还必须同时满足另一个硬性条件:当前数组(桶数组)的长度 ≥ 64。
触发树化的两个必要条件
只有当以下两点**同时成立**,链表才会被树化:
- 某个桶(bucket)中的链表节点数 ≥ 8(即实际长度达到 8 或更多)
- 整个 HashMap 的底层数组长度(capacity)≥ 64
为什么是 8,而不是 7 或 9?
这个阈值是基于大量实测和统计模型确定的:
- 在默认负载因子 0.75 下,哈希分布理想时,单个桶中元素个数服从泊松分布;桶内恰好有 8 个元素的概率已低于百万分之一,说明此时大概率不是随机碰撞,而是 hashCode 设计或数据本身存在偏差
- log₂(8) = 3,意味着红黑树查找最多比较 3 次,性能优势开始明显超越链表线性扫描
- 设得太小(如 3),树化太频繁,TreeNode 内存开销大(约是普通 Node 的两倍),得不偿失;设得太大(如 16),链表查找已明显变慢,优化滞后
不满足条件时会发生什么?
如果链表长度 ≥ 8,但数组长度还不到 64,HashMap 不会树化,而是优先触发扩容(resize)——因为小容量下链表过长,更可能是扩容不及时,而非真正严重的哈希冲突。
退化回链表的时机
红黑树不是一劳永逸的:当树中节点数减少到 ≤ 6 时,会自动退化为链表。这是为了在元素变少后,避免维持红黑树结构的额外开销。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











