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

文章目录

  • 面试详解之Java8为什么用红黑树来实现HashMap
    • 一、背景简介
    • 二、为什么要用红黑树
      • 2.1 红黑树概述
      • 2.2 红黑树性质
      • 2.3 思考
      • 2.4 红黑树的优势
      • 2.5 HashMap使用红黑树总结
    • 三、HashMap在jdk1.8之后引入了红黑树的概念,为什么采用6和8进行红黑树和链表转化

一、背景简介

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

二、为什么要用红黑树

2.1 红黑树概述
  • 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

  • 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

  • 下图是一个红黑树的例子。其中26是根节点;最下面是哨兵结点;每个叶节点的空指针指向哨兵结点。

2.2 红黑树性质
  • 红黑树是每个节点都带有颜色属性的二叉查找树,颜色是红色或黑色( 没有平衡二叉树(-1 +1 0)的平衡度高,左右孩子高度差可以超过1 )。
  • 在二叉查找树强制一般要求(即中序遍历是由小到大)以外,对于任何有效的红黑树我们增加了如下的额外要求:
  • 每个节点是红色或黑色(即必须是红或黑的一种。其中新插入的结点必须着色成红色)。
  • 根节点是黑色。
  • 每个叶节点(指NIL哨兵结点)是黑色。
  • 每个红色节点的两个子节点都是黑色。(即从每个叶子到根的所有路径上不能有两个连续的红色节点;而当双亲是黑,对孩子没要求,一黑一红、两黑、两红都行(即黑色可以连续))
  • 从任一节点到其每个叶子(算上了哨兵结点)的所有路径都包含相同数目的黑色节点。

这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

2.3 思考

为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍????

  • 每个红色节点的两个子节点都是黑色。
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
  • 最短路径为全黑,最长路径就是红黑节点交替(因为红色节点不能连续),每条路径的黑色节点相同,则最长路径、刚好是最短路径的两倍。

2.4 红黑树的优势
  • 红黑树是”近似平衡“的。
  • 红黑树相比avl树,在检索的时候效率其实差不多,都是通过平衡来二分查找。但对于插入删除等操作效率提高很多。红黑树不像avl树一样追求绝对的平衡,他允许局部很少的不完全平衡,这样对于效率影响不大,但省去了很多没有必要的调平衡操作,avl树调平衡有时候代价较大,所以效率不如红黑树,在现在很多地方都是底层都是红黑树的天下啦。
  • 红黑树的高度只比高度平衡的AVL树的高度(log2n)仅仅大了一倍,在性能上却好很多。
  • HashMap在里面就是链表加上红黑树的一种结构,这样利用了链表对内存的使用率以及红黑树的高效检索,是一种很happy的数据结构。
  • AVL树是一种高度平衡的二叉树,所以查找的非常高,但是,有利就有弊,AVL树为了维持这种高度的平衡,就要付出更多代价。每次插入、删除都要做调整,就比较复杂、耗时。所以,对于有频繁的插入、删除操作的数据集合,使用AVL树的代价就有点高了。
  • 红黑树只是做到了近似平衡,并不严格的平衡,所以在维护的成本上,要比AVL树要低。
  • 所以,红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树。
2.5 HashMap使用红黑树总结
  • java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据。 红黑树相当于排序数据,可以自动的使用二分法进行定位,性能较高。一般情况下,hash值做的比较好的话基本上用不到红黑树。
  • 红黑树牺牲了一些查找性能 但其本身并不是完全平衡的二叉树。因此插入删除操作效率略高于AVL树。
  • AVL树用于自平衡的计算牺牲了插入删除性能,但是因为最多只有一层的高度差,查询效率会高一些。

三、HashMap在jdk1.8之后引入了红黑树的概念,为什么采用6和8进行红黑树和链表转化

表示若桶中链表元素超过8时,会自动转化成红黑树若桶中元素小于等于6时,树结构还原成链表形式
1)原因:
  红黑树的平均查找长度是log(n),长度为8,查找长度为log(8)=3链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。

2)选择6和8的原因是:
果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。

2)选择6和8的原因是:
  中间有个差值7可以防止链表和树之间频繁的转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。

面试详解之Java8为什么用红黑树来实现HashMap相关推荐

  1. Java集合详解6:TreeMap和红黑树

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  2. 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)

    本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...

  3. Java面试详解(2020版):500+ 面试题和核心知识点详解

    与其在网上拼命的找面试题,不如加入我们畅快的阅读. 为了写好这些面试题,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的 Java 面试题型 ...

  4. 京东面试详解(渣渣吐血整理版)

    面试题链接:https://www.nowcoder.com/discuss/91413 3.java与c++的区别,知道多少答多少 JAVA中有异常机制,C++没有 C++有指针,java没有 C+ ...

  5. C++STL面试详解

    1.什么是C++STL? C++ STL从广义来讲包括了三类:算法,容器和迭代器. 算法包括排序,复制等常用算法,以及不同容器特定的算法. 容器就是数据的存放形式,包括序列式容器和关联式容器,序列式容 ...

  6. Java集合系列---红黑树(基于HashMap 超详细!!!)

    1 平衡因子: 左右子树 高度之差 LL型 右旋 LR型 -->LL 右旋 RR -->左旋 RL -->RR 左旋 左旋:逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代, ...

  7. hashmap为什么用红黑树_关于HashMap的实现,一篇文章带你彻底搞懂,再也不用担心被欺负

    推荐学习 刷透近200道数据结构与算法,成功加冕"题王",挤进梦中的字节 面试官杠上Spring是种什么体验?莫慌,送你一套面试/大纲/源码 前言 在介绍HashMap之前先了解一 ...

  8. 2019全网最全面试详解.

    前言 在投递简历之前,就是所谓的寒冬将至,开个年会都是守望寒冬,然后我身边的准备跳槽的大佬们,都是有几分凉意,不过我还好,总感觉一个人吃饱,全家不饿,?O(∩_∩)O哈!没想那么多,直接就全身投入,找 ...

  9. (建议收藏)万字长文,帮你一招搞定产品经理面试-详解产品经理面试大全

    ​ 前言 产品经理这个岗位由于其特殊性,在面试当中往往不能够以技术性的题目来衡量,也因其涉猎的范围广泛,所以在准备面试时必须面面俱到,才能够胸有成竹. 博主从个人方面.公司方面.项目方面.产品基础知识 ...

最新文章

  1. 两道相似题——water-easyJavabeans
  2. Samba nsswitch/pam_winbind.c文件输入验证漏洞
  3. linux查询字段排序,Linux 操作命令 sort
  4. js相对路径相关(比如:js中的路径依赖导入该js文件的路径)
  5. 使用DiskGenius对虚拟机磁盘进行压缩
  6. c语言中有哪些函数关系,C语言中有哪些常用的函数
  7. python中的序列化与反序列化
  8. ssis组件_使用SSIS Hadoop组件连接到Apache Hive和Apache Pig
  9. ui分离的进程 如何查找窗口句柄_如何使用 Linux screen
  10. python安装pdf模块_Python PyPDF2模块安装使用解析
  11. ubuntu 虚拟显示器制作
  12. php在线加密lua,AES 256 Lua + PHP
  13. 8本新书,为你的2020年管理之路指点迷津
  14. netty实战-概述
  15. 关闭appleid双重认证_Apple ID 被停用如何解决?
  16. Vue.js快速入门之五:Mockjs的使用和语法详解
  17. turtle画奥运五环图
  18. golang长连接和短连接的那些事儿
  19. 海量数据相关面试问题(二):海量数据热点数据/出现频度/TOP-K问题(TOP-K 分而治之/Hash映射 / Hashmap统计频度 / 堆排序决出排名)
  20. 云服务ftp服务器搭建_在阿里云服务器搭建FTP服务器,在本地电脑连接并操作

热门文章

  1. Java 爬取微信公众号文章(文字 + 图片)
  2. C语言实现TCP网络通信
  3. 从零开始之uboot、移植uboot2017.01(七、board_init_r分析)
  4. Word奇偶页的页眉页脚设置
  5. Rikka with Travels
  6. JS自定义Title文字提示
  7. node.js 后台代码怎么部署到服务器上?
  8. UI设计师如何脱颖而出 面试过程中要注意什么
  9. 揭秘PLC(三)RTS之IO篇
  10. Origin色卡(oth、pal格式)