一提到红黑树,我们就会想到自Jdk8以后HashMap的底层原理是数组加链表加红黑树。
HashMap
在内部使用了红黑树(RBTree)来优化某些情况下的性能问题。具体来说,当哈希冲突发生在链表上,并且链表长度达到一定阈值时,就会将链表转换为红黑树。这种转换能够提高查找、插入和删除操作的效率。
下面简单介绍 HashMap
的红黑树实现原理:
-
HashMap
中的每个桶(bucket)以链表或红黑树的形式来存储键值对。初始状态下,所有的桶都是空的。 -
当进行插入操作时,
HashMap
会通过哈希函数计算键的哈希码,并根据哈希码选择一个桶。如果该桶为空,则将键值对插入桶中;如果桶中已经存在一个或多个键值对,则进行下一步操作。 -
如果桶中的元素通过链表链接起来,当链表长度超过一个固定阈值(默认值为8)时,JDK 会将链表转换为红黑树。
-
在红黑树上进行插入、删除和查找等操作的时间复杂度都是 O(log n),相较于链表的 O(n) 时间复杂度具有更高的效率。
-
当红黑树上的节点数少于阈值(默认值为6)时,JDK 会将红黑树重新转换为链表。
通过使用红黑树来替代链表,HashMap
在处理冲突时能够提供更高的性能。它通过平衡树的调整来保持树的结构,并减少查找、插入和删除操作的时间复杂度。
红黑树(Red-Black Tree)底层是基于一种自平衡的二叉搜索树(自平衡的二叉搜索树是一种在执行插入和删除操作时能够自动保持平衡的二叉搜索树。),它在每个节点上都增加了一个存储位表示节点的颜色,可以是红色或黑色。红黑树具有以下特点:
- 每个节点都有一个颜色属性,可以是红色或黑色。
- 根节点是黑色的。
- 所有的叶子节点(空节点)都是黑色的。
- 如果一个节点是红色的,则它的两个子节点都是黑色的。
- 任意一个节点到其每个叶子节点的路径上包含相同数目的黑色节点。
这些特点保证了红黑树在插入、删除节点时能够自动调整保持平衡,从而保证了红黑树的查找、插入和删除操作的时间复杂度都是对数时间,即 O(log n)。
红黑树常用于实现具有高效查找、插入和删除操作的数据结构,如集合、映射等。它在各种编程语言的标准库中广泛应用,例如C++ STL中的map和set,以及Java的TreeMap和TreeSet等。