【HashMap底层数据结构】

HashMap底层数据结构



HashMap中数据存储的结构是数组+链表/红黑树

  • 数组作为基础的数据存储结构。

  • 链表是为了解决hash碰撞问题,可参考【HashMap底层原理】。

  • 红黑树是为了解决链表中的数据较多(满足链表长度超过8,数组长度大于64,才会将链表替换成红黑树才会树化)时效率下降的问题。

因为对于搜索,插入,删除操作多的情况下,使用红黑树的效率要高一些。

红黑树是一种特殊的二叉查找树,二叉查找树所有节点的左子树都小于该节点,所有节点的右子树都大于该节点,就可以通过大小比较关系来进行快速的检索。

在红黑树上插入或者删除一个节点之后,红黑树就发生了变化,当它不再是红黑树时,可以通过左旋和右旋,保证每次插入或者删除操作最多只需要三次旋转就能达到平衡。

因为红黑树强制约束了从根到叶子的最长的路径不多于最短的路径的两倍长,插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的。

为什么是使用红黑树而不是AVL树?

CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等待,如果插入时间过长必然等待时间更长,而红黑树相对AVL树他的插入更快!在AVL树中,从根到任何叶子的最短路径和最长路径之间的差异最多为1。在红黑树中,差异可以是2倍。

在AVL树中查找通常更快,但这是以更多旋转操作导致更慢的插入和删除为代价的,红黑树在添加,删除,查找相对较好。

那为什么HashMap不直接使用红黑树代替链表呢?

树的节点占的空间是普通节点的两倍,在节点足够多的时候才会使用树形数据结构,如果节点变少了还是会变回普通节点。所以节点太少的时候没必要转换、不仅转换后的数据结构占空间而且转换也需要花费时间。

在HashMap源码有这样一段描述,在使用分布良好的哈希代码时,很少使用树状容器。理想情况下,在随机散列码下,箱中节点的频率遵循泊松分布,默认大小调整阈值为0.75。

在理想状态下受随机分布的hashCode影响,链表中的节点遵循泊松分布,链表中的节点数是8的概率已经接近千分之一且此时链表的性能已经很差,所以在这种比较罕见的和极端的情况下才会把链表转变为红黑树,大部分情况下HashMap还是使用链表,如果理想的均匀分布节点数不到8就已经自动扩容了。


总结

以上就是今天要讲的内容,还希望各位读者大大能够在评论区积极参与讨论,给文章提出一些宝贵的意见或者建议,合理的内容,我会采纳更新博文,重新分享给大家。


提示:以下都是资源分享,求个一键三连。

博客封面

首先我要说声抱歉,作为一个学习的平台,封面引人注目是营销策略,大家不用太过在意哈,专注博客内容本身即可。当然有同学惦记着我博客的封面,这里也分享出来给大家。

点击:博客封面

提取码:2021

面试资料

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。

点击:面试资料

提取码:2021

200套PPT模板

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。

点击:200套PPT模板

提取码:2021

提问的智慧

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.youkuaiyun.com/topics/618164986)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值