/*创建红黑树*/
final void treeify(Node<K,V>[] tab) {
TreeNode<K,V> root = null;// 定义红黑树根节点root
for (TreeNode<K,V> x = this, next; x != null; x = next) {// 循环,定义x:循环变量,代表当前节点、next:当前节点的后继元
next = (TreeNode<K,V>)x.next;
x.left = x.right = null;// 初始化当前节点x的左子节点、右子节点
if (root == null) {// 若root为空,表明首次循环此时x指向的节点为根节点
x.parent = null;// 根节点无父节点
x.red = false;// 根节点为黑色
root = x;
}
else {// 除首次循环外其余均走这个分支
K k = x.key;// 获取当前节点的key与hash值
int h = x.hash;
Class<?> kc = null;// 定义key的Class对象kc
for (TreeNode<K,V> p = root;;) {// 循环,每次循环从根节点开始,寻找位置
int dir, ph;// 定义节点相对位置、节点p的hash值
K pk = p.key;// 获取节点p的key
if ((ph = p.hash) > h)
dir = -1;// 当前节点在节点p的左子树
else if (ph < h)
dir = 1;// 当前节点在节点p的右子树
else if ((kc == null &&
(kc = comparableClassFor(k)) == null) ||
(dir = compareComparables(kc, k, pk)) == 0)
dir = tieBreakOrder(k, pk);// 当前节点与节点p的hash值相等,当前节点key并没有实现Comparable接口或者实现Comparable接口并且与节点pcompareTo相等,该方法是为了保证在特殊情况下节点添加的一致性用于维持红黑树的平衡 TreeNode<K,V> xp = p;
if ((p = (dir <= 0) ? p.left : p.right) == null) {// 根据dir判断添加位置也是节点p的左右节点,是否为空,若不为null在p的子树上进行下次循环
x.parent = xp;// 若添加位置为null,建立当前节点x与父节点xp之间的联系
if (dir <= 0)// 确定当前节点时xp的左节点还是右节点
xp.left = x;
else
xp.right = x;
root = balanceInsertion(root, x);// 对红黑是进行平衡操作并结束循环
break;
}
}
}
}
moveRootToFront(tab, root);// 将红黑树根节点复位至数组头结点
}

JDK8 HashMap--treeify()树形化方法的更多相关文章

  1. Linux性能分析工具与图形化方法

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...

  2. 阿里P7岗位面试,面试官问我:为什么HashMap底层树化标准的元素个数是8

    前言 先声明一下,本文有点标题党了,像我这样的菜鸡何德何能去面试阿里的P7岗啊,不过,这确实是阿里p7级岗位的面试题,当然,参加面试的人不是我,而是我部门的一个大佬.他把自己的面试经验分享给了我,也让 ...

  3. php 两种获取分类树的方法

    php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...

  4. jdk8 HashMap tableSizeFor

    今天读jdk8  HashMap源码,构造函数中 根据initialCapacity初始化threshold public HashMap(int initialCapacity, float loa ...

  5. SpringBoot树获取方法总结

    最近项目中有需要获取全国行政区划省-市-区县-乡镇.街道办的树状结构数据,现将自己获取树的方法总结如下,有不到之处,敬请批评指正! 一.全国行政区划数据的整理以及获取 获取地址:https://pan ...

  6. JDK8 HashMap 源码解析

    HashMap中数据结构 在jdk1.7中,HashMap采用数组+链表(拉链法).因为数组是一组连续的内存空间,易查询,不易增删,而链表是不连续的内存空间,通过节点相互连接,易删除,不易查询.Has ...

  7. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

  8. hashmap冲突的解决方法以及原理分析:

    在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMa ...

  9. 【1】JDK8 HashMap扩容优化

    JDK1.7 VS JDK1.8 比较 优化概述: resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率 解决了resize时多线程死循环问题,但仍是非线程安全的 这里主要讲讲扩 ...

随机推荐

  1. 清除代码中的svn文件。

    @echo on color 2f mode con: cols=80 lines=25 @REM @echo 正在清理SVN文件,请稍候...... @rem 循环删除当前目录及子目录下所有的SVN ...

  2. Tornado之异步authenticated

    authenticated是tornado自带的登录验证装饰器,它的实现比较简单,验证比较简易,无法做到真正意义的前后端分离并且是同步的方式,所以这里我对它进行了重写,以适应异步JWT方式的登录验证. ...

  3. sql修改一个字段多个值

    UPDATE 表名 SET 修改的字段=REPLACE(修改的字段,'修改的值','新值');

  4. 什么是vue

    1. 什么是vue.js? 1.1.vue.js是目前最火的一个前端框架,和Angular.js.React.js并称为前端三大主流框架. 1.2.Vue.js是有一套构建用户界面的框架,只关注视图层 ...

  5. Terraria(泰拉瑞亚)存档覆盖(Linux)

    这是一篇关于游戏的不正经博客 ~ 游戏介绍: <泰拉瑞亚>是由Re-Logic公司开发的一款高自由度的沙盒游戏,于2011年5月16日在PC上发行. 玩家可以在游戏中做很多事情:制造武器战 ...

  6. spark伪分布式的安装

    不依赖hadoop 百度分享安装包地址:http://pan.baidu.com/s/1dD4BcGT 点击打开链接 解压 并重命名: 进入spark100目录: 修改配置: Cd conf 配置单击 ...

  7. line-height:1.5和line-height:150%的区别

    1. 给你个数,孩子自己算吧  line-height:1.5 父元素设置line-height:1.5会直接继承给子元素,子元素根据自己的font-size再去计算子元素自己的line-height ...

  8. Hibernate 双向一对多映射

    附代码: public class Order { private Integer id; private String OrderName; private Customer customer; p ...

  9. MongoDB 组合多个条件查询($and、$in、$gte、$lte)

    一,问题描述 数据格式: id, timeStamp,count 条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime.比如 timeS ...

  10. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧……然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...