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

本文目录
java 8 为什么要采用红黑树来管理hashmap
java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据。 红黑树相当于排序数据。可以自动的使用二分法进行定位。性能较高。
一般情况下,hash值做的比较好的话基本上用不到红黑树。
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方法转换回链表

更多文章:
物流调研ppt免费模板下载大全(ppt模板免费下载的网站有哪些)
2025年9月9日 05:15
switch default用法(C语言中的switch和default是什么意思)
2025年7月21日 18:15
js效果在浏览器上显示不出来(为什么360浏览器打开javascript插件时,看不到JS的效果,而IE和火狐浏览器可以)
2026年5月5日 17:45
js获取数组的最后一个元素(如何在JavaScript数组中选择最后一个元素)
2026年5月19日 23:00
服务器地址是什么(”服务器地址” 是什么 “端口号”是什么分别填写)
2025年7月25日 02:00
二维动画制作软件(二维动画制作软件CreatureAnimationPro的作用介绍)
2025年9月19日 14:30
file上传文件(ajax的Fileupload怎样实现多文件上传)
2026年5月26日 05:45
XxlJob集成GooFlow工作流?java要学到什么什么程度才能参加工作
2026年2月13日 23:00
javalibrary进入方法(java.library.path在哪)
2026年8月9日 10:00
淘宝客程序源码三合一(想购买个淘客app 哪个淘客app好)
2026年1月24日 13:45
text和textarea区别(在java里面textarea 是什么,详细作用)
2025年8月31日 19:00
powerful sense of fun(关于“电”的英语作文好句有哪些)
2026年8月20日 12:00
documents好用吗(iphone哪个视频压缩app好用)
2025年6月6日 06:15












