HashMap之TreeNode(红黑树)源码分析

HashMap之TreeNode源码分析

首先,TreeNode不仅是红黑树,还是链表。继承了LinkedHashMap.Entry,而Entry继承了 HashMap.Node如下图
HashMap之TreeNode(红黑树)源码分析

属性及构造方法

各属性的含义见下图
HashMap之TreeNode(红黑树)源码分析

find()

根据key和key class查找节点,从当前节点开始,大于找右子树,小于找左子树。
HashMap之TreeNode(红黑树)源码分析

putTreeVal()

给树添加一个节点,添加之后进行平衡操作balanceInsertion(),平衡之后需要确保在数组中的是根节点moveRootToFront()
HashMap之TreeNode(红黑树)源码分析

removeTreeNode()

删除一个节点, 删除前进行一系列的判断(空、长度等)详见注释。
对于红黑树节点的删除,可以理解为:找一个替换节点(大于当前节点的最小节点),替换节点与要删除的节点位置交换,删除节点就到了替换节点的位置上,其实删除的节点应该是替换节点。删除后会调用删除后不一定满足红黑树的性质。调用balanceDeletion(),进行删除平衡。
HashMap之TreeNode(红黑树)源码分析

treeify()

根据链表生成树,其实就是遍历链表,一个一个往红黑树里插入。插入后调用balanceInsertion(),插入后的平衡,详见代码注释
HashMap之TreeNode(红黑树)源码分析

untreeify()

红黑树转链表,此方法要简单的多。
HashMap之TreeNode(红黑树)源码分析

balanceInsertion()

此方法为为红黑树插入后的平衡,红黑树插入的逻辑也主要集中在此方法中。其中调用了rotateLeft()左旋,rotateRight()右旋方法可参考下方图片理解红黑树插入情景。
HashMap之TreeNode(红黑树)源码分析
图片地址:https://www.processon.com/view/link/5dd5fc33e4b0f8a5c6e3e1b1
HashMap之TreeNode(红黑树)源码分析
HashMap之TreeNode(红黑树)源码分析

balanceDeletion()

删除后的平衡操作,其实就是各种情况的分析。
HashMap之TreeNode(红黑树)源码分析

rotateLeft() 左旋

左旋,进行左旋的是,当前节点和他的右节点(可以参考图片)
右节点取代当前节点的位置(12到了5的位置上)
变为右节点的左节点(5下移了一级)
右节点的左节点变为当前节点的右节点(7变为5的右节点)
HashMap之TreeNode(红黑树)源码分析

rotateRight() 右旋

右旋,进行右旋的是,当前节点和他的左节点(可参考图片)
左节点取代当前节点的位置(12到了19的位置上)
变为左节点的右节点(19下移了一级)
左节点的右节点变为当前节点的左节点(13变为19的左节点)
HashMap之TreeNode(红黑树)源码分析

moveRootToFront()

看名字就知道是这个方法是干什么move root to front(移动root节点到前面)。移动之后会确认下当前数据结构是否符合红黑树性质checkInvariants()。
HashMap之TreeNode(红黑树)源码分析

checkInvariants()

HashMap之TreeNode(红黑树)源码分析