Java HashMap底层实现原理

 更新时间:2023年05月21日 11:15:05   作者:javacn  
HashMap在不同的JDK版本下的实现是不同的,在JDK1.7时,HashMap 底层是通过数组+链表实现的;而在JDK1.8时,HashMap底层是通过数组+链表或红黑树实现的,本详细介绍了HashMap底层是如何实现的,需要的朋友可以参考下

HashMap 在不同的 JDK 版本下的实现是不同的,在 JDK 1.7 时,HashMap 底层是通过数组 + 链表实现的;而在 JDK 1.8 时,HashMap 底层是通过数组 + 链表或红黑树实现的。

具体来说,HashMap 内部维护了一个数组,每个数组元素又是一个链表或者红黑树,每个链表或者红黑树节点存储了一个键值对。当需要存储新的键值对时,HashMap 会根据键的哈希值确定其在数组中的位置,如果该位置已经有了其他键值对,则通过链表或红黑树解决冲突,将新的键值对添加到链表或红黑树的末尾。当链表或红黑树长度达到一定程度后,HashMap 会自动将链表转换为红黑树,以提高查找效率。

如下图所示,HashMap 在 JDK 1.7 中的实现如下图所示:

在 JDK 1.8 时,HashMap 如下图所示:

链表和红黑树互转流程

链表升级为红黑树

在 JDK 1.8 之后,HashMap 默认是先使用数组 + 链表存储数据,但当满足以下两个条件时:

  • 链表的数量大于阈值(默认是 8)
  • 并且数组长度大于 64 时

为了(查询)的性能考虑会将链表升级为红黑树进行存储,具体执行流程如下:

  • 创建新的红黑树对象,并将链表内所有的键值对全部添加到红黑树中。

  • 将原来的链表引用指向新创建的红黑树。

红黑树退化为链表

当进行了删除操作,导致红黑树的节点小于等于 6 时,会发生退化,将红黑树转换为链表。这是因为当节点数量较少时,红黑树对性能的提升并不明显,反而占用了更多的内存空间。具体执行流程如下:

  • 从红黑树的根节点开始,按照中序遍历的顺序将所有节点加入到一个新的链表中。

  • 将原来的红黑树引用指向新创建的链表。

小结

HashMap 在 JDK 1.7 时,是通过数组 + 链表实现的,而在 JDK 1.8 时,HashMap 是通过数组 + 链表或红黑树实现的。在 JDK 1.8 之后,如果链表的数量大于阈值(默认为 8),并且数组长度大于 64 时,为了查询效率会将链表升级为红黑树,但当红黑树的节点小于等于 6 时,为了节省内存空间会将红黑树退化为链表。

到此这篇关于Java HashMap底层实现原理的文章就介绍到这了,更多相关HashMap 底层实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ Idea2017如何修改缓存文件的路径

    IntelliJ Idea2017如何修改缓存文件的路径

    这篇文章主要介绍了IntelliJ Idea2017如何修改缓存文件的路径,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 云计算实验:Java MapReduce编程

    云计算实验:Java MapReduce编程

    这篇文章主要介绍了云计算实验:Java MapReduce编程, 居于Java围绕MapReduce编程展开详细内容,文章助大家掌握MapReduce编程,理解MapReduce原理,需要的朋友可以参考一下
    2021-12-12
  • Spring使用@responseBody与序列化详解

    Spring使用@responseBody与序列化详解

    这篇文章主要介绍了Spring使用@responseBody与序列化详解,@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要的朋友可以参考下
    2023-08-08
  • Java OpenCV图像处理之SIFT角点检测详解

    Java OpenCV图像处理之SIFT角点检测详解

    SIFT,即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。本文将详细介绍一下Java OpenCV图像处理中的SIFT角点检测,需要的可以参考一下
    2022-02-02
  • Java接口测试之日志框架Logback的具体使用

    Java接口测试之日志框架Logback的具体使用

    本文主要介绍了Java接口测试之日志框架Logback的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SpringBoot深入理解之内置web容器及配置的总结

    SpringBoot深入理解之内置web容器及配置的总结

    今天小编就为大家分享一篇关于SpringBoot深入理解之内置web容器及配置的总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 用Set类判断Map里key是否存在的示例代码

    用Set类判断Map里key是否存在的示例代码

    本篇文章主要是对用Set类判断Map里key是否存在的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • Spring 异常单元测试的解决

    Spring 异常单元测试的解决

    这篇文章主要介绍了Spring 异常单元测试的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java中的CountDownLatch原理深入解析

    Java中的CountDownLatch原理深入解析

    这篇文章主要介绍了Java中的CountDownLatch原理深入解析,CountDownLatch是多线程控制的一种同步工具类,它被称为门阀、 计数器或者闭锁,这个工具经常用来用来协调多个线程之间的同步,或者说起到线程之间的通信,需要的朋友可以参考下
    2024-01-01
  • java关于list集合做删除操作时的坑及解决

    java关于list集合做删除操作时的坑及解决

    这篇文章主要介绍了java关于list集合做删除操作时的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论