Hashmap 在 JDK1.8中为什么引入的是红黑树而不是其他树

3 阅读2分钟

在 Java 的 HashMap 中(从 JDK 1.8 开始),当链表长度超过阈值(默认位 8)且数组容量大于 64 时,链表会转换为红黑树。

之所以选择 红黑树(Red-Black Tree) 而不是 AVL 树、B 树或普通的二叉搜索树,是基于性能、内存消耗和平衡策略之间的权衡。


1. 为什么不是普通的二叉搜索树 (BST)?

普通的二叉搜索树在极端情况下(例如插入的数据是有序的)会退化成一个链表

  • 后果: 查询效率从 O(logn)O(\log n) 直接跌回 O(n)O(n)
  • 结论: 为了保证最坏情况下的性能,必须选择一种能够“自我平衡”的树。

2. 为什么是红黑树而不是 AVL 树?

这是面试中最常被问到的点。AVL 树是“高度平衡”的,而红黑树是“弱平衡”的。

  • 平衡标准不同:

    • AVL 树: 严格要求左右子树高度差不超过 1。
    • 红黑树: 只要求最长路径不超过最短路径的 2 倍。
  • 查找效率: AVL 树由于更平衡,搜索速度略快。

  • 插入/删除效率: 这是关键。AVL 树为了维持严格的平衡,在插入或删除节点时,经常需要进行大量的旋转操作。而红黑树通过较少的旋转和变色就能达到平衡。

  • HashMap 的场景: HashMap 不仅仅是用来查询的,它还会频繁地进行插入和删除。红黑树在插入/删除和查找之间取得了一个完美的平衡(Trade-off) ,综合性能更优。

3. 为什么不是 B 树或 B+ 树?

B/B+ 树通常用于文件系统或数据库索引,它们的主要设计目的是减少磁盘 I/O 次数

  • 节点结构: B 树的一个节点可以存储多个数据。
  • 内存开销: 在内存中(如 HashMap 所在的堆空间),数据访问非常快,不需要通过增加节点分支来减少树高。
  • 复杂性: B 树的实现逻辑比红黑树复杂得多,且在数据量较小时(HashMap 的桶内元素通常不会多到离谱),B 树的优势完全无法体现,反而会因为节点内部的遍历逻辑浪费时间。