HashMap-TreeNode源码分析(jdk1.8

  • HashMap之TreeNode源码分析
    • 属性及构造方法
    • find()
    • putTreeVal()
    • removeTreeNode()
    • treeify()
    • untreeify()
    • balanceInsertion()
    • balanceDeletion()
    • rotateLeft() 左旋
    • rotateRight() 右旋
    • moveRootToFront()
    • checkInvariants()

HashMap之TreeNode源码分析

首先,TreeNode不仅是红黑树,还是链表。继承了LinkedHashMap.Entry,而Entry继承了 HashMap.Node如下图

属性及构造方法

各属性的含义见下图

find()

根据key和key class查找节点,从当前节点开始,大于找右子树,小于找左子树。

putTreeVal()

给树添加一个节点,添加之后进行平衡操作balanceInsertion(),平衡之后需要确保在数组中的是根节点moveRootToFront()

removeTreeNode()

删除一个节点, 删除前进行一系列的判断(空、长度等)详见注释。
对于红黑树节点的删除,可以理解为:找一个替换节点(大于当前节点的最小节点),替换节点与要删除的节点位置交换,删除节点就到了替换节点的位置上,其实删除的节点应该是替换节点。删除后会调用删除后不一定满足红黑树的性质。调用balanceDeletion(),进行删除平衡。

treeify()

根据链表生成树,其实就是遍历链表,一个一个往红黑树里插入。插入后调用balanceInsertion(),插入后的平衡,详见代码注释

untreeify()

红黑树转链表,此方法要简单的多。

balanceInsertion()

此方法为为红黑树插入后的平衡,红黑树插入的逻辑也主要集中在此方法中。其中调用了rotateLeft()左旋,rotateRight()右旋方法可参考下方图片理解红黑树插入情景。

图片地址:https://www.processon.com/view/link/5dd5fc33e4b0f8a5c6e3e1b1

balanceDeletion()

删除后的平衡操作,其实就是各种情况的分析。

rotateLeft() 左旋

左旋,进行左旋的是,当前节点和他的右节点(可以参考图片)
右节点取代当前节点的位置(12到了5的位置上)
变为右节点的左节点(5下移了一级)
右节点的左节点变为当前节点的右节点(7变为5的右节点)

rotateRight() 右旋

右旋,进行右旋的是,当前节点和他的左节点(可参考图片)
左节点取代当前节点的位置(12到了19的位置上)
变为左节点的右节点(19下移了一级)
左节点的右节点变为当前节点的左节点(13变为19的左节点)

moveRootToFront()

看名字就知道是这个方法是干什么move root to front(移动root节点到前面)。移动之后会确认下当前数据结构是否符合红黑树性质checkInvariants()。

checkInvariants()

HashMap之TreeNode(红黑树)源码分析相关推荐

  1. 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比

    HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...

  2. 字节跳动Android三面视频解析:framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等

    前言 对于字节跳动的二面三面而言,Framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等问题都成高频问点!然而很多的朋友在面试时却答不上或者答不全!今天在这分享下这些 ...

  3. 红黑树java源代码分析_JAVA 红黑树源码

    class RBTree>{ private static final String RedColor = "red"; private static final Strin ...

  4. NGINX下的红黑树源码详解(附 流程图和GIF)

    之前博主稍微讲解了下红黑树的原理,那么在这篇博客博主想要把红黑树讲的更加的透彻,以便于更多的人了解红黑树 (本博客会更加详细的介绍之前的博客没介绍到的,所以各位看官不同再回去翻看博主之前那篇红黑树的原 ...

  5. Linux内核的红黑树源码实现以及调用

    红黑树可以说是程序员经常遇到的一种数据结构,不管是工作还是面试都会涉及,有时候还会让你写一段红黑树代码. 本文主要是讲Linux中的红黑树,关于红黑树定义参考wiki:https://en.wikip ...

  6. 红黑树源码及错误解析

    /* 作者:田帅 学校:**大学 版本:红黑树初始版本 */ #include"stdio.h" #include"malloc.h" #define MIN ...

  7. HashMap、ConcurretnHashMap面试题详解,源码分析

    文章目录 面试题 HashMap.LinkedHashMap和TreeMap的区别是什么? ①:为什么hashmap每次扩容大小为2的n次方? ③:jdk1.7的hashmap的扩容操作是在元素插入之 ...

  8. HashMap、ConcurrentHashMap(1.7、1.8)源码分析 + 红黑树

    个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 序号 内容 1 Java基础面试题 2 JVM面试题 3 Java并发编程面试 4 计算 ...

  9. HashMap红黑树原理及源码分析---图形、注释一应俱全

    目录 一.红黑树定义 二.节点新增原理: 三.红黑树的生成 2.1 一个节点 2.2 两个节点 2.3 三个节点 2.3.1 第二个节点作为root右子树情况下 2.3.2 第二个节点作为root左子 ...

最新文章

  1. bzoj 1441: Min 裴蜀定理
  2. 管道符和作业控制 shell变量 环境变量配置文件
  3. 给服务器装系统U盘要处理吗,服务器装系统从u盘装
  4. MySQL服务的启动与停止-使用命令行工具
  5. SPOJ - LCS2 Longest Common Substring II(后缀自动机)
  6. 你是第几名:Excel 中 Large 和 Small 的用法
  7. [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射
  8. 影像拼接(3种方法)
  9. 回归指令_用一条指令在新款 Mac 上找回经典的开机启动声
  10. spring + hibernate + mysql 事务不回滚
  11. 华为徐直军:今年超3亿设备搭载鸿蒙系统
  12. 量子计算机概念谁提出来,目前的量子计算机从根本上来说是一个伪概念
  13. 若依前后端分离集成Mybatis-Plus
  14. CSS中Position定位属性的使用
  15. html5-5 HTML5表单元素和内嵌框架
  16. 问题2:无法打开包括文件:“windows.h”:No such file or directory
  17. M3U8视频流下载神器CocoCut
  18. 七夕到了 —— 属于 Java 的浪漫,拿去吧~ 祝表白成功
  19. binlog2sql快速闪回
  20. 12、Hadoop框架MapReduce 统计人数、总分、关联

热门文章

  1. 数据结构与算法分析之---部分排序算法的实现
  2. 外汇保证金交易的优势
  3. 数据结构实验四 约瑟夫生死游戏
  4. Vue 无缝公告滚动
  5. PostgreSql递归包含层级level
  6. 博途V16 获取系统时间转换成字符串
  7. 实现js程序在vscode控制台输出的方法(看完方便多了)
  8. 瑞萨IDE:CS+ for CC新建工程配置方法
  9. b站刘二大人-----04反向传播算法
  10. 2022年华中杯B题 量化投资问题