链表转换位红黑树

两个条件,必须同时满足两个条件才能进行转换

  • 条件1:单个链表长度大于等于8
  • 条件2:hashMap的总长度大于64个、且树化的节点位置不能为空

    从源码看

    条件一:

    在putVal()方法中,可知当binCount大于7即节点数大于8时进行
  1. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
  2. boolean evict) {
  3. // ...省略
  4. for (int binCount = 0; ; ++binCount) {
  5. if ((e = p.next) == null) {
  6. p.next = newNode(hash, key, value, null);
  7. // TREEIFY_THRESHOLD == 8 当binCount大于等于7时 即结点数大于八时进行
  8. if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
  9. treeifyBin(tab, hash);
  10. break;
  11. }
  12. }
  13. //...省略
  14. }

条件二:

对于treeifyBin()方法

  1. final void treeifyBin(Node<K,V>[] tab, int hash) {
  2. int n, index; Node<K,V> e;
  3. // MIN_TREEIFY_CAPACITY= 64 当数据长度小于64是进行扩容 大于64才进行树化
  4. if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
  5. resize();
  6. // 且树化的节点位置不能为空
  7. else if ((e = tab[index = (n - 1) & hash]) != null) {
  8. //... 省略
  9. }
  10. }

红黑树退化为链表

两种情况

  • 第一 树内节点数小于等于6
  • 第二:根节点为空,根节点的左右子树为空,根节点的左子树的左子树为空
  1. // 条件一 在树的空间调整代码中
  2. final void split(HashMap<K,V> map, Node<K,V>[] tab, int index, int bit) {
  3. //...省略
  4. for (TreeNode<K,V> e = b, next; e != null; e = next) {
  5. next = (TreeNode<K,V>)e.next;
  6. e.next = null;
  7. if ((e.hash & bit) == 0) {
  8. if ((e.prev = loTail) == null)
  9. loHead = e;
  10. else
  11. loTail.next = e;
  12. loTail = e;
  13. ++lc;
  14. }
  15. else {
  16. if ((e.prev = hiTail) == null)
  17. hiHead = e;
  18. else
  19. hiTail.next = e;
  20. hiTail = e;
  21. ++hc;
  22. }
  23. }
  24. if (loHead != null) {
  25. // lc 记录的是存放在原本位置不变的数据的个数
  26. //UNTREEIFY_THRESHOLD = 6 untreeify() 树的退化操作
  27. if (lc <= UNTREEIFY_THRESHOLD)
  28. tab[index] = loHead.untreeify(map);
  29. else {
  30. tab[index] = loHead;
  31. if (hiHead != null) // (else is already treeified)
  32. loHead.treeify(tab);
  33. }
  34. }
  35. //... 省略
  36. }
  37. //条件二 在移除树节点的方法内 removeTreeNode()
  38. final void removeTreeNode(HashMap<K,V> map, Node<K,V>[] tab,
  39. boolean movable) {
  40. // 进行对根节点,左右子树,左左子树的判断然后进行进行退化操作
  41. if (root == null || root.right == null ||
  42. (rl = root.left) == null || rl.left == null) {
  43. tab[index] = first.untreeify(map); // too small
  44. return;
  45. }
  46. }

Hash链表转换为红黑树,和树转换为链表的条件的更多相关文章

  1. jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机

    本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...

  2. HashMap 链表和红黑树的转换

    HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素超过8时,会自动转化成红黑树:若桶中元素小于等于6时,树结构还原成链表形式. 原因: 红黑树的平均查找长度是log(n),长度为8 ...

  3. Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?

    我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...

  4. 浅谈AVL树,红黑树,B树,B+树原理及应用(转)

    出自:https://blog.csdn.net/whoamiyang/article/details/51926985 背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上 ...

  5. 浅谈AVL树,红黑树,B树,B+树原理及应用

    背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使 ...

  6. 从二叉搜索树到AVL树再到红黑树 B树

    这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...

  7. 红黑树/B+树/AVL树

    RB Tree 红黑树  :http://blog.csdn.net/very_2/article/details/5722682 Nginx的RBTree实现   :http://blog.csdn ...

  8. 二叉查找树 平衡二叉查找树 红黑树 b树 b+树 链表 跳表 链表

    https://www.cnblogs.com/mojxtang/p/10122587.html二叉树的新增遍历查找

  9. Java数据结构与算法(21) - ch09红黑树(RB树)

    红-黑规则1. 每一个节点不是红色的就是黑色的2. 根总是黑色的3. 如果节点是红色的,则它的子节点必须是黑色的:如果节点是黑色的,其子节点不是必须为红色.4. 从根到叶节点或空子节点的每条路径,必须 ...

随机推荐

  1. 在VMware上安装Linux虚拟机

    1.新建虚拟机 2.选择典型安装 3.点击稍后安装操作系统 4.选择类型和版本 5.选择一个英文路径 6. 7.调整硬件 8. 9. 10.选择第一项 11.选择中文 12.选择最小安装 13. 14 ...

  2. CentOS 7.6 部署 GlusterFS 分布式存储系统

    文章目录 GlusterFS简介 环境介绍 开始GlusterFS部署 配置hosts解析 配置GlusterFS 创建文件系统 安装GlusterFS 启动GlusterFS 将节点加入到主机池 创 ...

  3. Dubbo扩展点应用之一filter及@Activate自激活使用

    与很多框架一样,Dubbo也存在拦截(过滤)机制,可以通过该机制在执行目标程序前后执行我们指定的代码.Dubbo中Filter只是Dubbo提供的可自定义扩展的扩展点之一.通过该扩展点地理解,可以触类 ...

  4. Zabbix 6.0:原生高可用(HA)方案部署

    Blog:博客园 个人 本部署文档适用于CentOS 8.X/RHEL 8.X/Anolis OS 8.X/AlmaLinux 8.X/Rockey Linux 8.X. 原生的HA方案终于来了 相比 ...

  5. AQS源码二探-JUC系列

    本文已在公众号上发布,感谢关注,期待和你交流. AQS源码二探-JUC系列 共享模式 doAcquireShared 这个方法是共享模式下获取资源失败,执行入队和等待操作,等待的线程在被唤醒后也在这个 ...

  6. Java超全大纲.jpg

    Java超全大纲.jpg

  7. css文字超出指定行数显示省略号

    display: -webkit-box; overflow: hidden; word-break: break-all; /* break-all(允许在单词内换行.) */ text-overf ...

  8. 【C# 异常处理】 开端

    异常概述 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是 ...

  9. C#(1):XML DOM、System.Xml.XmlDocument

     一.XML DOM概述 XML 文档大小写敏感.属性用引号括起来,每一个标记都要闭合. DOM是XML文档的内存中树状的表示形式. 继承关系图: XmlNode;//XML节点 ......Xml ...

  10. Windows Server 2012 在桌面上显示”我的电脑”

    转至:https://jingyan.baidu.com/article/f25ef2544f6883482c1b82e5.html Windows Server 2012 沒有快捷方式显示我的电脑到 ...