zoukankan      html  css  js  c++  java
  • 【HashMap底层数据结构】

    我是廖志伟,一名Java开发工程师幕后大佬社区创始人Java领域优质创作者CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架中间件的底层源码,对于大型分布式微服务、三高架构(高性能高并发高可用)有过实践架构经验。

    博主:java_wxid
    社区:幕后大佬



    本文的大概内容:

    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

    提问的智慧

    福利大放送,我就求个一键三连,拜托了,这对我真的很重要。
    点击:提问的智慧
    提取码:2021

    一键三连

    感谢大家的支持,用心写博文分享给大家,你的支持(点赞收藏关注)是对我创作的最大帮助。
    微信公众号:南北踏尘
    主页地址:java_wxid
    社区地址:幕后大佬

    给读者大大的话

    我本身是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜、所剩不多的发量,就剩下180的大高个了。就是我这样的一个人,默默坚持写博文也有好多年了,有句老话说的好,牛逼之前都是傻逼式的坚持。希望自己可以通过大量的作品,时间的积累,个人魅力、运气和时机,可以打造属于自己的技术影响力。同时也希望自己可以成为一个懂技术懂业务懂管理的综合型人才,作为项目架构路线的总设计师,掌控全局的团队大脑,技术团队中的绝对核心是我未来几年不断前进的目标。

    点击关注博主

    点击关注博主:幕后大佬
    点击关注博主:java_wxid
    点击关注社区:幕后大佬

  • 相关阅读:
    MsSql数据库存储过程加密解密
    Delete Exists
    SQL Server 2008数据库日志收缩
    MSSQL PIVOT 实现行列转置
    Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
    oracle的分析函数over 及开窗函数
    Asprise-OCR的使用
    【整理】动态加载Web Services
    【转载】Python正则表达式指南
    Mac中PyCharm设置GitHub的步骤
  • 原文地址:https://www.cnblogs.com/javawxid/p/15644352.html
Copyright © 2011-2022 走看看