HashMap链表转红黑树需同时满足:单桶链表长度≥8且底层数组容量≥64;否则优先扩容;树化还要求key可比较,阈值8和64分别基于泊松分布与经验权衡。

HashMap 中链表转红黑树不是单纯看长度到了 8 就执行,而是必须同时满足两个硬性条件:
单桶链表长度 ≥ 8
这是指同一个数组索引(即同一个 bucket)下链表中实际存放的 Node 节点个数达到或超过 8。注意:这个计数从第一个 key-value 节点开始,不包含额外头结点。
- 每次 put 操作插入新节点后,会检查该桶当前链表长度;
- 若插入前已有 7 个节点,插入第 8 个后触发长度条件;
- 但仅此一项不足够,还需结合整体容量判断。
哈希表底层数组容量 ≥ 64
即 table.length >= MIN_TREEIFY_CAPACITY(默认值为 64)。这个条件确保不会在小容量表上过早引入红黑树结构。
- 如果当前容量是 16 或 32,哪怕某个桶链表已到 8,也不会树化;
- 此时会优先触发
resize()扩容,把容量翻倍; - 只有扩容后容量达到 64 且对应桶链表仍 ≥ 8,才会真正调用
treeify()构建红黑树。
其他关键细节
树化过程本身也有前提约束,不是所有情况都能成功转换:
- 树化发生在
putVal()的末尾检查阶段,由treeifyBin()方法统一处理; - 转换时需保证 key 类型支持比较:要么实现
Comparable,要么传入外部Comparator,否则静默失败、维持链表; - TreeNode 是 Node 的子类,保留
next引用,便于后续可能的退化操作; - 阈值 8 和 64 并非随意设定:8 来自泊松分布推导(λ = 0.5 时 P(X ≥ 8) ≈ 10⁻⁶),代表极大概率出现哈希异常;64 是经验平衡值,兼顾扩容次数与结构开销。
不复杂但容易忽略。

















