我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、幕后大佬社区创始人。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。
博主:java_wxid
博主:Java廖志伟
社区:幕后大佬
HashMap中数据存储的结构是数组+链表/红黑树
因为对于搜索,插入,删除操作多的情况下,使用红黑树的效率要高一些。
红黑树是一种特殊的二叉查找树,二叉查找树所有节点的左子树都小于该节点,所有节点的右子树都大于该节点,就可以通过大小比较关系来进行快速的检索。
在红黑树上插入或者删除一个节点之后,红黑树就发生了变化,当它不再是红黑树时,可以通过左旋和右旋,保证每次插入或者删除操作最多只需要三次旋转就能达到平衡。
因为红黑树强制约束了从根到叶子的最长的路径不多于最短的路径的两倍长,插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的。
为什么是使用红黑树而不是AVL树?
CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等待,如果插入时间过长必然等待时间更长,而红黑树相对AVL树他的插入更快!在AVL树中,从根到任何叶子的最短路径和最长路径之间的差异最多为1。在红黑树中,差异可以是2倍。
在AVL树中查找通常更快,但这是以更多旋转操作导致更慢的插入和删除为代价的,红黑树在添加,删除,查找相对较好。
那为什么HashMap不直接使用红黑树代替链表呢?
树的节点占的空间是普通节点的两倍,在节点足够多的时候才会使用树形数据结构,如果节点变少了还是会变回普通节点。所以节点太少的时候没必要转换、不仅转换后的数据结构占空间而且转换也需要花费时间。
在HashMap源码有这样一段描述,在使用分布良好的哈希代码时,很少使用树状容器。理想情况下,在随机散列码下,箱中节点的频率遵循泊松分布,默认大小调整阈值为0.75。
在理想状态下受随机分布的hashCode影响,链表中的节点遵循泊松分布,链表中的节点数是8的概率已经接近千分之一且此时链表的性能已经很差,所以在这种比较罕见的和极端的情况下才会把链表转变为红黑树,大部分情况下HashMap还是使用链表,如果理想的均匀分布节点数不到8就已经自动扩容了。
总结
以上就是今天要讲的内容,还希望各位读者大大能够在评论区积极参与讨论,给文章提出一些宝贵的意见或者建议,合理的内容,我会采纳更新博文,重新分享给大家。
四连 关注点赞收藏⭐️留言
感谢大家的支持,用心写博文分享给大家,你的支持(点赞收藏⭐️留言)是对我创作的最大帮助。
微信公众号:南北踏尘
主页地址:java_wxid
社区地址:幕后大佬
给读者大大的话
我本身是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜、所剩不多的发量,就剩下180的大高个了。就是我这样的一个人,默默坚持写博文也有好多年了,有句老话说的好,牛逼之前都是傻逼式的坚持。希望自己可以通过大量的作品,时间的积累,个人魅力、运气和时机,可以打造属于自己的技术影响力。同时也希望自己可以成为一个懂技术,懂业务,懂管理的综合型人才,作为项目架构路线的总设计师,掌控全局的团队大脑,技术团队中的绝对核心是我未来几年不断前进的目标。
面试资料
福利大放送,欢迎关注点赞收藏⭐️留言,拜托了,这对我真的很重要。
点击:面试资料
提取码:2021
200套PPT模板
福利大放送,欢迎关注点赞收藏⭐️留言,拜托了,这对我真的很重要。
点击:200套PPT模板
提取码:2021
提问的智慧
福利大放送,欢迎关注点赞收藏⭐️留言,拜托了,这对我真的很重要。
点击:提问的智慧
提取码:2021
Java开发学习路线
名称 | 链接 |
---|---|
JavaSE | 点击: JavaSE |
MySQL专栏 | 点击: MySQL专栏 |
JDBC专栏 | 点击: JDBC专栏 |
MyBatis专栏 | 点击: MyBatis专栏 |
Web专栏 | 点击: Web专栏 |
Spring专栏 | 点击: Spring专栏 |
SpringMVC专栏 | 点击: SpringMVC专栏 |
SpringBoot专栏 | 点击: SpringBoot专栏 |
SpringCould专栏 | 点击: SpringCould专栏 |
Redis专栏 | 点击: Redis专栏 |
Linux专栏 | 点击: Linux专栏 |
Maven3专栏 | 点击: Maven3专栏 |
Spring Security5专栏 | 点击: Spring Security5专栏 |
更多专栏 | 更多专栏,请到 java_wxid主页 查看 |
P5学习路线图
P6学习路线图
P7学习路线图
P8学习路线图
以上四张图详细介绍了作为Java开发工作者所需要具备的知识技能,同学们学废了嘛,有想法系统学习的同学可以私聊我,欢迎关注点赞收藏⭐️留言。
博主:java_wxid
博主:Java廖志伟
社区:幕后大佬