天天看点

HashMap源码一览(中)

      今天我们接着上面继续分析HashMap的源码,JDK8中我们引入了红黑树,这一章节,我们主要来探讨下红黑树。 在引入红黑树之前,我们先了解下二叉查找树(Binary Search Tree BST)。

    1. 二叉查找树

     BST具备的特性:

   (1)左侧树值小于等于它的根节点值。

   (2)右侧树大于等于它的根节点值。

   (3)左右侧数都是二叉查找树。

     BST具备的优点:

   (1)通过上面的特征描述,相比线型存储,它优化了查找的性能,比如说:下面就是一个典型的二叉树查找,如果我们要查找数值为10的节点,只需要3步,9->13->11->10。

HashMap源码一览(中)

BST具备的缺陷:

1.糟糕情况下会变成线型结构,这样会大大降低性能。(这种情况比如说:插入节点总是小于根节点或者大于根节点),如下图所示:

HashMap源码一览(中)

2. 二叉查找树

    基于二叉查找树存在这种缺陷,红黑树的出现就是解决这种问题,它是二叉查找树的典型,又叫做平衡二叉查找树,接下来具体讲讲红黑树的一些特征。

 红黑树的特征:

(1)根节点是黑色

(2)顾名思义,节点的颜色分为红色或者黑色

(3)空节点为黑色

(4)每个红色节点的子节点都是黑色节点(不能有两个连续的红色节点)

(5)从任意节点到每个叶子的所有路径黑色节点个数相同

HashMap源码一览(中)

        由于红黑树具有上面这些特征的约束,我们在对红黑树进行插入,删除操作时可能会破坏原有红黑树的树结构,这个时候需要对数结构重新作出调整,红黑数调整的方式有有两种:变色和旋转(左旋转、右旋转)。

  •  左旋转

对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图:

HashMap源码一览(中)
  • 右旋转

对于当前结点而言,如果左子、左孙子结点均为红色,则执行右旋转,如下图:

HashMap源码一览(中)
  • 变色

对于当前结点而言,如果左、右子结点均为红色,则执行变色,如下图:

HashMap源码一览(中)

继续阅读