之前有提到在put操作时,如果发现链表结构中的元素超过了TREEIFY_THRESHOLD(默认为8),则会把链表转换为红黑树,已便于提高查询效率。代码如下:
if (binCount >= TREEIFY_THRESHOLD)
treeifyBin(tab, i);
下面博主将详细分析整个过程,并用一个链表转换为红黑树的过程为案例来分析。博文从如下几个方法进行分析阐述:
- 红黑树
- ConcurrentHashMap链表转红黑树源码分析
- 链表转红黑树案例
红黑树
先看红黑树的基本概念:红黑树是一课特殊的平衡二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn)。红黑树每个节点都有一个标识位表示颜色,红色或黑色,具备五种特性:
- 每个节点非红即黑
- 根节点为黑色
- 每个叶子节点为黑色。叶子节点为NIL节点,即空节点
- 如果一个节点为红色,那么它的子节点一定是黑色
- 从一个节点到该节点的子孙节点的所有路径包含相同个数的黑色节点
请牢记这五个特性,它在维护红黑树时选的格外重要
红黑树结构图如下: