java红黑树好处

红黑树,b+树分别用于什么场景,为什么

红黑树属于“黑平衡”的二叉树,虽然牺牲了一定的平衡性,但是add、remove操作要由优于AVL树也就是说RB-Tree的“统计性能”更佳!Java中TreeSet,TreeMap的底层都是基于RedBlackTree红黑树的;

B+树主要用在文件系统以及数据库做索引。比如磁盘存储、文件系统、MySQL数据库

java红黑树好处

什么是红黑树?

最近研究JDK源码的时候,发现TreeMap和TreeSet底层数据结构是红黑树,当然,TreeSet其实本质上就是Value为一个固定值的TreeMap。在JDK1.8以后,HashMap也用到了红黑树。

那红黑树到底是怎样的一种数据结构呢?相信大家都不是非常了解,我也去翻了好多的相关文章,发现一篇很有趣的漫画,可以帮助大家很快了解红黑树大概是怎样的一种数据结构,有哪些特点。 只是大概的介绍一下红黑树,详细的实现大家还是请参考相关的算法书籍。

以下内容转自: 漫画算法:什么是红黑树?

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:

1.查看根节点9:

3.由于10 13,因此查看左孩子11:

假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12:

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

下图中这棵树,就是一颗典型的红黑树:

什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子:

1.向原红黑树插入值为14的新节点:

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:

但这样并不算完,因为凭空多出的黑色节点打破了规则5,所以发生连锁反应,需要继续把节点25从黑色变成红色:

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图:

图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。大家看下图:

图中,身为左孩子的Y取代了X的位置,而X变成了自己的右孩子。此为右旋转。

首先,我们需要做的是变色,把节点25及其下方的节点变色:

这时候我们需要把节点13看做X,节点8看做Y,像刚才的示意图那样进行右旋转:

如果想要详细了解红黑树算法,可以参考这篇文章: Java数据结构和算法(十一)——红黑树

红黑树和平衡二叉树 区别

红黑树和平衡二叉树的主要区别如下:

平衡二叉树(AVL)树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而的英文旋转非常耗时的。所以平衡二叉树(AVL)适合用于插入与删除次数比较少,但查找多的情况。

红黑树在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log

n)。所以红黑树适用于搜索,插入,删除操作较多的情况。

扩展资料:

平衡二叉树在Windows

NT内核中广泛存在。

红黑树的应用:

1、在C

++的STL中,地图和集都是用红黑树实现的;

2、著名的Linux的的进程调度完全公平调度程序,用红黑树管理进程控制块,进程的虚拟内存区域都存储在一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指针指向相邻的高地址虚拟地址空间;

3、IO多路复用的epoll的的的实现采用红黑树组织管理的sockfd,以支持快速的增删改查;

4、Nginx的的的中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;

5、Java中的TreeMap中的实现。

参考资料:

百度百科-平衡二叉树

百度百科-红黑树

jdk1.8的hashmap真的是大于8就转换成红黑树,小于6就变成链表吗

本文夹杂部分笔者个人观点,如描述有误,欢迎指正

写这篇文章,是因为最近研究hashmap源码的时候,会结合网上的一些博客来促进理解。而关于红黑树和链表相互转换这一块,大部分的文章都会这样描述:hashmap中定义了两个常量:

当链表元素个数大于8的时候,就会转换为红黑树;当红黑树元素个数小于6的时候,就会转换回链表。

笔者通过仔细观察,发现这种说法并不严谨。hashMap中确实定义了这两个常量,但并非简单通过元素个数的判断来进行转换。

链表转换为红黑树的最终目的,是为了解决在map中元素过多,hash冲突较大,而导致的读写效率降低的问题。在源码的putVal方法中,有关红黑树结构化的分支为:

即网上所说的,链表的长度大于8的时候,就转换为红黑树,我们来看看treeifyBin方法:

可以看到在treeifyBin中并不是简单地将链表转换为红黑树,而是先判断table的长度是否大于64,如果小于64,就通过扩容的方式来解决,避免红黑树结构化。原因呢?笔者个人觉得链表长度大于8有两种情况:

第二种情况是可以用扩容的方式来避免的,扩容后链表长度变短,读写效率自然提高。另外,扩容相对于转换为红黑树的好处在于可以保证数据结构更简单。

由此可见并不是链表长度超过8就一定会转换成红黑树,而是先尝试扩容

基本思想是当红黑树中的元素减少并小于一定数量时,会切换回链表。而元素减少有两种情况:

hashMap的remove方法,会进入到removeNode方法,找到要删除的节点,并判断node类型是否为treeNode,然后进入删除红黑树节点逻辑的removeTreeNode方法中,该方法有关解除红黑树结构的分支如下:

可以看到,此处并没有利用到网上所说的,当节点数小于UNTREEIFY_THRESHOLD时才转换,而是通过红黑树根节点及其子节点是否为空来判断。而满足该条件的最大红黑树结构如下:

节点数为10,大于 UNTREEIFY_THRESHOLD(6),但是根据该方法的逻辑判断,是需要转换为链表的

resize的时候,判断节点类型,如果是链表,则将链表拆分,如果是TreeNode,则执行TreeNode的split方法分割红黑树,而split方法中将红黑树转换为链表的分支如下:

这里才用到了 UNTREEIFY_THRESHOLD 的判断,当红黑树节点元素小于等于6时,才调用untreeify方法转换回链表

java 8 为什么要采用红黑树来管理hashmap

java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据。 红黑树相当于排序数据。可以自动的使用二分法进行定位。性能较高。

一般情况下,hash值做的比较好的话基本上用不到红黑树。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 02:21:09
下一篇 2024年3月27日 02:28:21

相关推荐

  • java性能监控btrace,java性能监控工具arthas

    如何用性能监测器监控软件线程 要实现监控电脑某一进程在一段时间内的性能参数,可以采取以下步骤:选择合适的监控工具:首先,选择适合您需求的监控工具。 使用操作系统自带的任务管理器:在Windows操作系统中,按下Ctrl + Shift + Esc 快捷键可打开任务管理器。在任务管理器的“性能”选项卡中,可查看CPU、内存、磁盘、网络等方面的性能指标,以及当前…

    2024年5月14日
    3900
  • 如何打开ie浏览器java支持,ie浏览器怎么启用java

    高手进来下~!~ 提示说要要语言支持 ,因为你安装时没装好,卸载掉软件后重新安装即可。启动时加载的bootfont文件没有了。。 因为,一个人自呱呱落地依法成为我国公民起,就与法律结下了不解之缘。他既受到我国法律的保护,又受到我国法律的约束;既充分享有法律赋予的公民权利,又必然履行法律规定的公民义务。 因为是台式机,我想是第一种情况。假设你说的是办公室,有一…

    2024年5月14日
    3100
  • java重载paint,java重载方法

    java中我新建一个类,它继承自JLabel类,我重写了它的paint方法画了一个… 你不要重写 paint 方法,你完全可以直接使用 swing 里面的组件,在 JPanel 中放入很多个组件,包括图,Label 等。 自己修改一个panel类,继承自JPanel,这个类在paint方法中,先绘制本身的图像,然后才绘制子类的图像,并且会根据子类…

    2024年5月14日
    3000
  • java序列化应用,java序列化是干什么的

    在java里如何使用数据库中的序列(java中的序列化) 1、什么是序列化:\x0d\x0a序列化理解成“打碎”是可以的,不过在书本上的名词就是将对象转换成二进制。 2、序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机…

    2024年5月14日
    2800
  • 学java好还是数据库好,java学什么数据库

    搞数据库与JAVA,哪个更好? 1、但是Python缺点也比较明显,那就是Python的性能远不及Java,另外与大数据平台的耦合度也不如Java好。但是如果你使用Python做算法实现、数据分析、数据呈现等应用是完全没有问题的,效率也比较高。 2、个人理解,数据库开发是软件开发的一部分,谈不上哪个好。好多应用软件都要用到数据,合理的组织数据可以节省软件运行…

    2024年5月14日
    4200
  • java运行字节码使用命令,运行java字节码的命令

    20条必背java知识点学生考专必备 1、,JDK、JRE和JVM之间的关系 JDK(Java Development Kit):Java开发工具包,jdk是整个Java开发的核心,它集成了jre和一些好用的小工具(javac.exe,java.exe,jar.exe等)。 2、必备的Java的基础知识字节基类型 当我们讨论二进制时,我们实际上是在讨论比特的…

    2024年5月14日
    4200
  • java财务数据的处理,java财务软件

    java中的建模是什么? 1、建模 使用计算机描述一个系统的行为。例如,电子表格程序可以用来处理财务数据,代表公司的行为;开发商业计划;评估公司经营改变可能造成的影响。请参阅 simulation,spreadsheet program。 2、模型其实就是java中常说的 物件的概念 也就是一个实体。究其根本其实就是一个java类 平角的模型是什么样的? 平…

    2024年5月14日
    3600
  • java只允许输入数字,java只能输入数字

    java中从控制台输入(要怎样才能规定只能输入数字呢)希望能有源代码说明… 为组件增加键盘事件侦听器addKeyListener KeyListener 接受键盘输入的字符,判断是否是数字,如果不是,则直接返回。 获取文本框的元素,设置键盘监听事件,如果键盘输入的是非数字或字母,return false,就是不作为的意思。判断的时候用正则表达式和…

    2024年5月14日
    2800
  • java获取header,JAVA获取文件夹下所有文件

    java请求组装cookie和header 在使用HttpClient发送http请求,携带cookie的方式在在httpClient的请求对象头部设置cookie属性值,跟设置content-Type等属性一样。cookie值其实也是键值对,你直接调用setHead的方法即可。 java cookie是什么,让我们一起了解一下?Cookie是由服务器端生成…

    2024年5月14日
    3500
  • java读取pom.xml,JAVA读取Excel

    java如何从串口读取数据带GUI 1、为了从RS485读取数据,由于暂时没有硬件设备,系统是win7,故采用Virtual Serial Port Drive(VSPD)这块虚拟串口软件代替。并下载sscom3exe模拟串口通信软件。 2、java通过串口就可以跟读卡器建立串口通信。 3、去我的空间上看吧。rs232通信实际大家都叫串口通信。http://…

    2024年5月14日
    3500

发表回复

登录后才能评论



关注微信