美文网首页
HashMap为什么使用红黑树

HashMap为什么使用红黑树

作者: 垂直居中的句号 | 来源:发表于2022-12-24 15:32 被阅读0次

解决hash冲突问题

在 JDK1.8 中,HashMap 是由 数组+链表+[红黑树]构成,新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。

在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。当一个值中要存储到Map的时候会根据Key的值来计算出他的[hash]通过哈希来确认到数组的位置,如果发生哈希碰撞就以链表的形式存储 在Object源码分析中解释过,但是这样如果链表过长来的话,HashMap会把这个链表转换成红黑树来存储。

image.png

但是这样的话问题来了,HashMap为什么要使用红黑树呢,这样结构的话不是更麻烦了吗??

这个问题我也没有想过,其实很多在看的时候只会在乎红黑树的实现而忽略到了为什么要使用的这个问题,我也是在写本文的时候突发疑惑。参考了网上的例子,同时也解释了为什么阀值为8:

因为Map中桶的元素初始化是链表保存的,其查找性能是O(n),而树结构能将查找性能提升到O(log(n))。当链表长度很小的时候,即使遍历,速度也非常快,但是当链表长度不断变长,肯定会对查询性能有一定的影响,所以才需要转成树。至于为什么阈值是8,我想,去源码中找寻答案应该是最可靠的途径。

https://dwz.cn/nPFXmXwJ

8是bin(bin就是bucket,即HashMap中hashCode值一样的元素保存的地方)从链表转成树的阈值,但是并没有说明为什么是8:当bin变得很大的时候,就会被转换成TreeNodes中的bin,其结构和TreeMap相似,也就是红黑树:

TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时才会转成TreeNodes,而是否足够多就是由TREEIFY_THRESHOLD的值决定的。当bin中节点数变少时,又会转成普通的bin。并且我们查看源码的时候发现,链表长度达到8就转成红黑树,当长度降到6就转成普通bin。

为什么不是一开始就将其转换为TreeNodes,而是需要一定节点数才转为TreeNodes,说白了就是trade-off,空间和时间的权衡。

当hashCode离散性很好的时候,树型bin用到的概率非常小,因为数据均匀分布在每个bin中,几乎不会有bin中链表长度会达到阈值。但是在随机hashCode下,离散性可能会变差,然而JDK又不能阻止用户实现这种不好的hash算法,因此就可能导致不均匀的数据分布。不过理想情况下随机hashCode算法下所有bin中节点的分布频率会遵循泊松分布,我们可以看到,一个bin中链表长度达到8个元素的概率为0.00000006,几乎是不可能事件。所以,之所以选择8,不是拍拍屁股决定的,而是根据概率统计决定的。由此可见,发展30年的Java每一项改动和优化都是非常严谨和科学的。

相关文章

  • HashMap实现原理

    HashMap实现原理 HashMap的底层使用数组+链表/红黑树实现。 transient Node[...

  • HashMap 1.7 和1.8区别

    一、数据结构区别 HashMap 1.7 使用数组+链表HashMap 1.8 使用Node数组+链表+红黑树(当...

  • Android面试题知识点积累(七)

    jdk1.8中HashMap底层链表转红黑树的阈值为什么是8?红黑树转链表为什么是6? 和hashcode碰撞次数...

  • 【Java】为什么1.8中HashMap链表转换成红黑树的阈值是

    通过本文,可以学到如下知识点:① 全面地了解为什么HashMap链表转红黑树的阈值是8?② 为什么红黑树还原成链表...

  • HashMap(1.8)源码分析

    HashMap底层使用的数据结构是数组+链表/红黑树。 1 HashMap中的静态常量 DEFAULT_INITI...

  • 记录面试map

    1.hashmap数据结构?是线程安全吗?为什么不是线程安全?1.8为什么用黑红树?1.8为什么大于8使用红黑树?...

  • HashMap

    HashMap是数组+链表+红黑树。 Node.hash是key的hash1.8的HashMap增加了红黑树来增加...

  • Java类集框架 —— LinkedHashMap源码分析

    前言 我们知道HashMap底层是采用数组+单向线性链表/红黑树来实现的,HashMap在扩容或者链表与红黑树转换...

  • hashmap源码分析

    HashMap的数据结构 从上图中可以很清楚的看到,HashMap的数据结构是数组+链表+红黑树(红黑树since...

  • HashMap小探(三)之红黑树

    HashMap中的红黑树 红黑树 平衡二叉查找树 红黑树是一种平衡二叉查找树(Binary Search Tree...

网友评论

      本文标题:HashMap为什么使用红黑树

      本文链接:https://www.haomeiwen.com/subject/yfbrqdtx.html