一、前言

在jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。

二、红黑树回顾

红黑树的英文是“Red-Black Tree",简称R-B Tree。它是一种不严格的平衡二叉查找树,我前面说了,它的定义是不严格符合平衡二叉查找树的定义的。那红黑树空间是怎么定义的呢?

顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记为红色除此之外,一棵红黑树还需要满足这样几个要求:

  • 根节点是黑色的;
  • 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;
  • 任何相邻的节点都不能同时为红色,红色节点是被黑色节点隔开的;
  • 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点

1.红黑树比较传统的定义是需要满足以下五个特征:

  • 每个节点或者是黑色,或者是红色。
  • 根节点是黑色。
  • 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  • 如果一个节点是红色的,则它的子节点必须是黑色的。
  • 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
  • 其特点在于给数的每一个节点加上了颜色属性,在插入的过程中通过颜色变换和节点旋转调平衡。其实博主不是很喜欢上面的定义,还有一种视角就是将它与二三树比较。

2.红黑树的优势

红黑树是”近似平衡“的。

红黑树相比avl树,在检索的时候效率其实差不多,都是通过平衡来二分查找。但对于插入删除等操作效率提高很多。红黑树不像avl树一样追求绝对的平衡,他允许局部很少的不完全平衡,这样对于效率影响不大,但省去了很多没有必要的调平衡操作,avl树调平衡有时候代价较大,所以效率不如红黑树,在现在很多地方都是底层都是红黑树的天下啦。

红黑树的高度只比高度平衡的AVL树的高度(log2n)仅仅大了一倍,在性能上却好很多。

HashMap在里面就是链表加上红黑树的一种结构,这样利用了链表对内存的使用率以及红黑树的高效检索,是一种很happy的数据结构。

AVL树是一种高度平衡的二叉树,所以查找的非常高,但是,有利就有弊,AVL树为了维持这种高度的平衡,就要付出更多代价。每次插入、删除都要做调整,就比较复杂、耗时。所以,对于有频繁的插入、删除操作的数据集合,使用AVL树的代价就有点高了。

红黑树只是做到了近似平衡,并不严格的平衡,所以在维护的成本上,要比AVL树要低。

所以,红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树。

三、总结

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

红黑树牺牲了一些查找性能 但其本身并不是完全平衡的二叉树。因此插入删除操作效率略高于AVL树。
AVL树用于自平衡的计算牺牲了插入删除性能,但是因为最多只有一层的高度差,查询效率会高一些。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://www.cnblogs.com/liwei2222/p/8013367.html
  2. https://blog.csdn.net/lansefeiyang_lonson/article/details/88708556
  3. https://blog.csdn.net/every__day/article/details/86544187

算法高级(26)-在Java8中为什么要使用红黑树来实现的HashMap?相关推荐

  1. 算法基础知识科普:8大搜索算法之红黑树(下)

    这是介绍红黑树的最后一部分,令y为要删除结点,n为要删除结点的子结点(子结点最多有1个),w为y的兄弟结点,删除操作的重点是使红黑树删除结点并通过调整后仍满足自身是搜索二叉树和设定的三点规则.删除操作 ...

  2. 算法基础知识科普:8大搜索算法之红黑树(上)

    平衡二叉树(AVL)是一种特殊的二叉搜索树(BST),即每个结点的值都大于其左子树且小于其右子树的值(若存在),并通过引入平衡因子的概念来保持树的平衡.平衡二叉树算法的重点是在插入.删除结点时,如何保 ...

  3. 算法基础知识科普:8大搜索算法之红黑树(中)

    红黑树也是一种特殊形式的二叉搜索树,通过结点的颜色以及三条规则来保证二叉搜索树的平衡.规则1:根结点的颜色是黑色,规则2:叶子结点到根结点路径上遇到的黑色结点数目相同,规则3:叶子结点到根结点路径上无 ...

  4. 《算法导论》学习总结 — 13. 第13章 红黑树(2)

    插入结点用到了上一次BST的插入函数(做了一点添加),并且在此基础上增加了保持红黑性质的调整函数. 还是先看看插入函数: void RBTreeInsert(RBTree &T, int k) ...

  5. 算法高级(1)-概述

    算法是对特定问题求解步骤的描述.对于同一个问题,我们可能会用不同的算法来求解,我们可以根据算法的可读性.效率等进行取舍.针对不同的数据保存方式,也会有不同的算法. 很多同学会觉得,我工作经验五年,工作 ...

  6. Java8中的HashMap分析

    本篇文章是网上多篇文章的精华的总结,结合自己看源代码的一些感悟,其中线程安全性和性能测试部分并未做实践测试,直接是"拿来"网上的博客的. 哈希表概述 哈希表本质上一个数组,数组中每 ...

  7. 《算法》中的红黑树实现

    有别于上一篇文章介绍的红黑树,在<算法<第四版>>一书中用另一套规则实现了红黑树,主要手段是递归,实现思路来自于2-3树,这本书中有详细的解读,在这里我谈谈自己对它的理解. 首 ...

  8. 面试详解之Java8为什么用红黑树来实现HashMap

    面试详解之Java8为什么用红黑树来实现HashMap 文章目录 面试详解之Java8为什么用红黑树来实现HashMap 一.背景简介 二.为什么要用红黑树 2.1 红黑树概述 2.2 红黑树性质 2 ...

  9. 红黑树的原理_红黑树插入算法实现原理分析

    ­ 引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...

最新文章

  1. 计算机二级申请创新学分理由,创新学分申请书范文
  2. iOS开发小技巧--利用苹果官方API播放视频(方法已经过时,了解一下)
  3. iOS 本地时间与GMT时间相互转换
  4. 用户测评 | EDAS Serverless 上手体验
  5. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
  6. 深度操作系统 15 发布 —— 不忘初心,追逐梦想
  7. 二、OC的构造方法和descriprtion方法
  8. 《剑指offer》变态跳台阶
  9. JeecgBoot与MongoDB集成实战文档
  10. Service Mesh简史
  11. WPF调用OCX控件
  12. 写直通与访存次数计算问题
  13. java打包-exe文件-最终以setup形式发布的解决之道
  14. TortoiseGit推送
  15. Eye Tracking Methodology Theory and Practice, Third Edition
  16. Linux | 文件系统与操作
  17. win10快捷截图录屏
  18. 6 大神器在手,难怪是无敌的
  19. 工业相机常见的数据传输接口方式
  20. SNF快速开发平台MVC-集成了百度开源项目echars

热门文章

  1. Java数据结构与算法(12) - ch06递归(回文anagram)
  2. easyui和My97DatePicker结合使用报“权限错误”的问题
  3. Redis之跳跃表实现
  4. 不同的二叉搜索树 II
  5. 浅析ElasticSearch原理
  6. golang中,new和make的区别
  7. Nginx进程间通讯方式
  8. 魅族显示无法连接到服务器,魅族连接电脑无法识别怎么办_魅族手机usb无法连接电脑的解决方法...
  9. Keil 中的预处理命令const
  10. Golang 并发编程之Context