jdk1.8 hashmap.balanceInsertion方法源码

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]

static <K,V> TreeNode<K,V> balanceInsertion(TreeNode<K,V> root,
                                                    TreeNode<K,V> x) {
            x.red = true;//当新添加一个节点到树中后,将其颜色置为red
            //开始循环,xp为x的父亲,xpp为x的爷爷,
    		//xppl为x的爷爷的左孩子,xppr为x的爷爷的右孩子
            for (TreeNode<K,V> xp, xpp, xppl, xppr;;) {
                if ((xp = x.parent) == null) {//1、  当插入的节点的父节点为null,则将该节点颜色置为black。
                    x.red = false;
                    return x;
                }
                else if (!xp.red || (xpp = xp.parent) == null)//2、  当插入节点的父节点颜色为black或者x的爷爷为空,不需要调整。
                    return root;
                //走到这里说明父节点为红色
                if (xp == (xppl = xpp.left)) {//x的父节点为x爷爷的左孩子
                	//3、当爷爷的右节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
					//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
                    if ((xppr = xpp.right) != null && xppr.red) {
                        xppr.red = false;
                        xp.red = false;
                        xpp.red = true;
                        x = xpp;
                    }
                    else {//叔父节点为空或者叔父节点为黑色
                        if (x == xp.right) {//插入节点为父节点的右节点同时父亲节点是祖父节点的左孩子,则进行左旋
                        	//此时树结构为xpp==>左xp==>右x
                            root = rotateLeft(root, x = xp); 
                            //此时树结构为xpp==>左r==>左(x和xp)
                            xpp = (xp = x.parent) == null ? null : xp.parent; 
                            //此时树结构为xpp==>左xp(原来的x)==>左x(原来的xp)
                        }
                        if (xp != null) {
                            xp.red = false;//此时树结构为xpp==>左xp(黑)==>左x(红)
                            if (xpp != null) {
                                xpp.red = true;//此时树结构为xpp(红)==>左xp(黑)==>左x(红)
                                root = rotateRight(root, xpp);
                                //xppp==>左xp(黑)==>左x(红)
                                //				  ==>右xpp(红)
                            }
                        }
                    }
                }
                else {//否则父节点为爷爷的右节点
                	//当爷爷的左节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
					//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
                    if (xppl != null && xppl.red) {
                        xppl.red = false;
                        xp.red = false;
                        xpp.red = true;
                        x = xpp;
                    }
                    else {//叔父节点为空或者叔父节点为黑色
                        if (x == xp.left) {//插入节点为父节点的左节点同时父亲节点是祖父节点的右孩子,则进行右旋
                        	//此时树结构为xpp==>右xp==>左x
                            root = rotateRight(root, x = xp);
                            //此时树结构为xpp==>右l==>右(x和xp)
                            xpp = (xp = x.parent) == null ? null : xp.parent;
                            //此时树结构为xpp==>右xp(原来的x)==>右x(原来的xp)
                        }
                        if (xp != null) {
                            xp.red = false;//此时树结构为xpp==>右xp(黑)==>右x(红)
                            if (xpp != null) {
                                xpp.red = true;//此时树结构为xpp(红)==>右xp(黑)==>右x(红)
                                root = rotateLeft(root, xpp);
                                //xppp==>右xp(黑)==>右x(红)
                                //				  ==>左xpp(红)
                            }
                        }
                    }
                }
            }
        }

红黑树在线生成链接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
雪皓梅丹的HashMap分析之红黑树树化过程:https://www.cnblogs.com/finite/p/8251587.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: JDK 1.8 tar.gz是指Java Development Kit(JDK)的1.8版本的压缩文件格式为tar.gz。 JDK是Java开发工具包的缩写,它是由Oracle公司提供的用于开发和运行Java应用程序的软件包。JDK 1.8是Java的第8个主要版本,在其发布时具有重要的新特性和改进。 tar.gz是一种常见的压缩文件格式,在Linux和Unix系统中广泛使用。它是通过将文件和目录打包成一个tar文件,然后使用gzip进行压缩而创建的。tar.gz文件既可以用于文件的备份,也可以用于文件的传输和分发。 JDK 1.8 tar.gz文件通常用于安装JDK 1.8版本。要使用JDK 1.8,首先需要下载对应的tar.gz文件,然后解压缩该文件。解压缩后,会得到一个包含JDK 1.8所有必要文件的目录结构。 安装JDK 1.8需要根据操作系统的不同执行不同的步骤。在Linux和Unix系统上,可以通过设置环境变量来配置JDK 1.8的路径,以便可以在终端中直接使用javac和java命令。 JDK 1.8提供了许多新特性,包括Lambda表达式、方法引用、函数式接口、默认方法等。这些功能使得Java编程更加简洁高效。因此,JDK 1.8 tar.gz文件的下载和安装对于Java开发人员来说非常重要。 ### 回答2: JDK 1.8 tar.gz 是指 Java Development Kit 1.8 的压缩文件格式。JDK 是 Java 开发工具包的缩写,是用于开发和编译 Java 程序的软件包。1.8 表示 JDK 的版本号,即 JDK 1.8 代表 Java 开发工具包的第八个主要版本。tar.gz 是常见的文件压缩格式,其中 tar 表示归档(Archive),gz 表示使用 Gzip 压缩算法进行压缩。 JDK 1.8 tar.gz 文件通常包含了 JDK 1.8 的所有组件和库,可以在 Linux 或类似操作系统上使用。通过解压这个压缩文件,可以获得 JDK 1.8 的文件目录结构,包括 Java 编译器、运行时环境、开发工具和相关库等。这些文件可以帮助开发者在其计算机上进行 Java 编程和应用的开发、测试和部署。 要使用 JDK 1.8 tar.gz 文件,首先需要将其解压缩到目标文件夹。可以使用解压缩工具如 tar 命令来进行解压缩。解压后,可以设置环境变量,指向解压后的 JDK 1.8 文件夹,这样就可以在命令行或 IDE 中使用 JDK 1.8 的命令和工具。 JDK 1.8 引入了许多新的特性和改进,例如 Lambda 表达式、函数式接口、Stream API、新的时间日期 API 等等。这些新特性可以提高开发效率、简化代码编写,并且使得 Java 在处理并发、函数式编程等方面变得更强大和灵活。 总之,JDK 1.8 tar.gz 是 Java Development Kit 1.8 的压缩文件格式,包含了 Java 开发工具包的各个组件和库,可以帮助开发者进行 Java 开发和应用的编译、测试和部署。 ### 回答3: JDK是Java Development Kit的缩写,是用于Java程序开发的软件开发工具包。JDK1.8tar.gz是指JDK1.8版本的压缩文件。 tar.gz是一种常见的文件压缩格式,常用于Linux和Unix系统。tar是指tarball,是一种对多个文件进行打包的工具。gz是指gzip,是一种数据压缩程序。tar.gz就是将多个文件打包成tar格式后再使用gzip进行压缩得到的文件。 JDK1.8tar.gz文件可以通过解压缩工具进行解压缩,得到包含JDK1.8版本所有文件和目录的文件夹。这些文件和目录包括JDK的运行环境、编译器、调试工具等,可以用于开发和运行Java程序。 JDK1.8版本是Java的其中一个重要版本,它提供了许多新的特性和改进,包括Lambda表达式、函数式编程、Stream API等。使用JDK1.8版本可以更加方便地开发和管理Java程序,提高程序的性能和效率。 总之,JDK1.8tar.gz是用于Java程序开发的JDK1.8版本的压缩文件,可以通过解压缩得到JDK1.8的所有文件和目录,用于开发和运行Java程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值