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

3分钟让你大白:HashMap之红黑树树化进程

发布时间:2019-10-13 08:58:37 所属栏目:建站 来源:追逐仰望星空
导读:01 概述 HashMap是Java措施员行使频率最高的用于映射(键值对)处理赏罚的数据范例。跟着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现举办了优化,譬喻引入红黑树的数据布局和扩容的优化等。本文首要说明一下HashMap中红黑树树化的进程。 02

我们看一下treeify代码

  1. final void treeify(Node<K, V>[] tab) 
  2.  { 
  3.  TreeNode<K, V> root = null; 
  4.  // 以for轮回的方法遍历适才我们建设的链表。 
  5.  for (TreeNode<K, V> x = this, next; x != null; x = next) 
  6.  { 
  7.  // next向前推进。 
  8.  next = (TreeNode<K, V>) x.next; 
  9.  x.left = x.right = null; 
  10.  // 为树根节点赋值。 
  11.  if (root == null) 
  12.  { 
  13.  x.parent = null; 
  14.  x.red = false; 
  15.  root = x; 
  16.  } else 
  17.  { 
  18.  // x即为当前会见链表中的项。 
  19.  K k = x.key; 
  20.  int h = x.hash; 
  21.  Class<?> kc = null; 
  22.  // 此时红黑树已经有了根节点,上面获取了当前插手红黑树的项的key和hash值进入焦点轮回。 
  23.  // 这里从root开始,是以一个自顶向下的方法遍历添加。 
  24.  // for轮回没有节制前提,由代码内break跳出轮回。 
  25.  for (TreeNode<K, V> p = root;;) 
  26.  { 
  27.  // dir:directory,较量添加项与当前树中会见节点的hash值判定插手项的路径,-1为左子树,+1为右子树。 
  28.  // ph:parent hash。 
  29.  int dir, ph; 
  30.  K pk = p.key; 
  31.  if ((ph = p.hash) > h) 
  32.  dir = -1; 
  33.  else if (ph < h) 
  34.  dir = 1; 
  35.  else if ((kc == null && (kc = comparableClassFor(k)) == null) 
  36.  || (dir = compareComparables(kc, k, pk)) == 0) 
  37.  dir = tieBreakOrder(k, pk); 
  38.  // xp:x parent。 
  39.  TreeNode<K, V> xp = p; 
  40.  // 找到切合x添加前提的节点。 
  41.  if ((p = (dir <= 0) ? p.left : p.right) == null) 
  42.  { 
  43.  x.parent = xp; 
  44.  // 假如xp的hash值大于x的hash值,将x添加在xp的左边。 
  45.  if (dir <= 0) 
  46.  xp.left = x; 
  47.  // 反之添加在xp的右边。 
  48.  else 
  49.  xp.right = x; 
  50.  // 维护添加后红黑树的红黑布局。 
  51.  root = balanceInsertion(root, x); 
  52.   
  53.  // 跳出轮回当前链表中的项乐成的添加到了红黑树中。 
  54.  break; 
  55.  } 
  56.  } 
  57.  } 
  58.  } 
  59.  // Ensures that the given root is the first node of its bin,本身翻译一下。 
  60.  moveRootToFront(tab, root); 
  61.  } 

第一次轮回会将链表中的首节点作为红黑树的根,尔后的轮回会将链表中的的项通过较量hash值然后毗连到响应树节点的左边可能右边,插入也许会粉碎树的布局以是接着执行balanceInsertion。

(编辑:湖南网)

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

热点阅读