hashmap链表转红黑树需同时满足:链表长度≥8且数组容量≥64;key须可比较;树化在putval末尾由treeifybin处理;退化阈值为6。

Java 中 HashMap 底层链表转红黑树,不是单看链表长度够不够,而是两个硬性条件必须**同时满足**。
链表长度 ≥ 8
指同一个桶(数组索引位置)中,实际存储的键值对节点数达到或超过 8 个。
注意:这个计数是真实 Node 个数,从第一个元素开始算起;插入第 8 个节点后,binCount 变为 7(因计数从 0 开始),此时触发检查逻辑;严格来说,是插入第 9 个元素前,发现已有 8 个节点,才进入树化判断流程。
数组容量 ≥ 64
即底层 table 数组的 length ≥ MIN_TREEIFY_CAPACITY(默认值 64)。
如果当前容量是 16 或 32,哪怕某个桶链表已经长到 8,也不会树化,而是优先执行 resize() 扩容。
只有扩容后数组长度达到 64,且该桶链表长度仍 ≥ 8,才会真正调用 treeify() 构建红黑树。
其他必要前提
- key 类型必须可比较:要么实现 Comparable 接口,要么构造 HashMap 时传入 Comparator,否则树化静默失败,维持链表结构
- 树化发生在 putVal() 方法末尾,由 treeifyBin() 统一处理
- 红黑树退化回链表的阈值是 6(UNTREEIFY_THRESHOLD),不是 8 —— 这是为了避免在 7 和 8 之间反复切换结构,减少开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











