加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

3分钟让你明白:HashMap之红黑树树化过程

发布时间:2019-10-13 19:01:54 所属栏目:优化 来源:追逐仰望星空
导读:01 概述 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文主要分析一下HashMap中红黑树树化的过程。 02

我们已知xp是xpp的左节点,首先判断了x是xp的左节点还是右节点,如果是右节点的话构成了下面的结构。

3分钟让你明白:HashMap之红黑树树化过程

这中结构需要进行双旋转,首先先进行一次向左旋转。

7.1 左旋转

  1.  1 static <K, V> TreeNode<K, V> rotateLeft(TreeNode<K, V> root, TreeNode<K, V> p) 
  2.  2 { 
  3.  3 // r:right,右节点。 
  4.  4 // pp:parent parent,父节点的父节点。 
  5.  5 // rl:right left,右节点的左节点。 
  6.  6 TreeNode<K, V> r, pp, rl; 
  7.  7 if (p != null && (r = p.right) != null) 
  8.  8 { 
  9.  9 if ((rl = p.right = r.left) != null) 
  10. 10 rl.parent = p; 
  11. 11 if ((pp = r.parent = p.parent) == null) 
  12. 12 (root = r).red = false; 
  13. 13 else if (pp.left == p) 
  14. 14 pp.left = r; 
  15. 15 else 
  16. 16 pp.right = r; 
  17. 17 r.left = p; 
  18. 18 p.parent = r; 
  19. 19 } 
  20. 20 return root; 
  21. 21 } 

1.刚进入方法时,状态如下图。(RL可能是空的)

3分钟让你明白:HashMap之红黑树树化过程

2.进入了if块后执行到第10行后。

  1. 9 if ((rl = p.right = r.left) != null) 
  2. 10 rl.parent = p; 
3分钟让你明白:HashMap之红黑树树化过程

此时如果9行的条件符合的话执行10行RL指向P,如果RL为null的话,P的右节点指向null。

3.接着看11和12行代码。

  1. 11 if ((pp = r.parent = p.parent) == null) 
  2. 12 (root = r).red = false; 

首先我们看11行if里面的赋值语句所造成的影响。

3分钟让你明白:HashMap之红黑树树化过程

在if里面的表达式不管符不符合条件()内的内容都会执行。

如果符合条件的话会执行12行的代码,变成了下面的结果。

3分钟让你明白:HashMap之红黑树树化过程

由于PP为空所以只剩下这三个。

4.如果11行的条件为假的话,执行完11行()内的表达式后执行13行

  1. 13 else if (pp.left == p) 
  2. 14 pp.left = r; 
3分钟让你明白:HashMap之红黑树树化过程

满足条件的话R和PP互相关联。

5.由于进入了13和14行所以不进入15和16行的else语句。

  1. 15 else 
  2. 16 pp.right = r; 

6.看17和18行。

  1. 17 r.left = p; 
  2. 18 p.parent = r; 
3分钟让你明白:HashMap之红黑树树化过程

最终执行完了一个旋转变成了我们开始说的第一种旋转的形式,这个结构还需要向右旋转一次。

  1. if (x == xp.right) 
  2.  { 
  3.  root = rotateLeft(root, x = xp); 
  4.  xpp = (xp = x.parent) == null ? null : xp.parent; 
  5.  } 
  6. xpp = (xp = x.parent) == null ? null : xp.parent; 

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读