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

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

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

接着我们看向右旋转的代码

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

3.刚进来的时候结构是这个样子。

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

在这里的P就是刚才传进来的XPP。

4.这里我们认为LR是存在的,其实这个不影响主要的旋转,为空就指向null呗,直接执行完9和10行。

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

5.在这里我们假使PP是存在的,直接执行完11的表达式不再执行12行。(不再分析不存在的情况)。

  1. 11 if ((pp = l.parent = p.parent) == null) 
  2. 12 (root = l).red = false; 
3分钟让你明白:HashMap之红黑树树化过程

6.由于11行的条件不符合,现在直接执行13行的表达式,不符合执行15行else,执行16行。

  1. 15 else 
  2. 16 pp.left = l; 
3分钟让你明白:HashMap之红黑树树化过程

7.最后执行层17和18行。

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

最终完成两次的旋转。

08 疑问?

大家可能觉得和刚才接不上其实是这样的,刚才在右旋转前的时候的图像是这个样的。

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

因为我们传进来的是XPP,所以结合上一次的向左旋转我们在向右旋转的时候看到全图应该是这个样子的。(注:XPPP可能是XPP的左父节点也可能是右父节点这里不影响,而且可以是任意颜色)

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

(编辑:晋中站长网)

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

热点阅读