Java HashMap底层实现原理

作者:javacn 时间:2023-10-31 19:55:34 

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

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

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

Java HashMap底层实现原理

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

Java HashMap底层实现原理

链表和红黑树互转流程

链表升级为红黑树

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

  • 链表的数量大于阈值(默认是 8)

  • 并且数组长度大于 64 时

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

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

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

红黑树退化为链表

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

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

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

小结

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

来源:https://juejin.cn/post/7234467007718391868

标签:Java,HashMap,底层,实现
0
投稿

猜你喜欢

  • springboot整合EHCache的实践方案

    2023-08-23 23:48:31
  • Android权限管理之Permission权限机制及使用详解

    2023-04-07 09:12:45
  • java求100以内的素数示例分享

    2021-06-30 21:34:39
  • Android自定义控件之日期选择控件使用详解

    2021-07-11 09:39:52
  • Maven管理SpringBoot Profile详解

    2022-03-20 09:57:45
  • C#生成带logo的二维码

    2021-11-03 17:38:41
  • Java由浅入深讲解继承下

    2023-11-25 12:21:26
  • Android实现调用摄像头进行拍照功能

    2021-07-16 20:26:07
  • PowerManagerService之唤醒锁的使用获取创建示例解析

    2021-09-29 06:42:22
  • java最新版本连接mysql失败的解决过程

    2022-05-21 17:29:58
  • spring cloud gateway 限流的实现与原理

    2023-04-10 16:47:56
  • Spring占位符Placeholder的实现原理解析

    2023-03-14 18:14:00
  • C#后端接收form-data,创建实体类教程

    2023-08-23 21:07:57
  • maven springboot如何将jar包打包到指定目录

    2022-12-09 00:40:25
  • java简单实现多线程及线程池实例详解

    2023-05-12 05:47:04
  • SpringCloud启动失败问题汇总

    2021-07-28 02:45:51
  • 简单了解Thymeleaf语法 数据延迟加载使用实例

    2021-11-27 04:05:49
  • C#实现图片上传与浏览切换的方法

    2023-10-06 06:44:05
  • Java项目开发中实现分页的三种方式总结

    2021-08-25 21:36:36
  • 详解C# 结构体

    2023-09-30 15:37:19
  • asp之家 软件编程 m.aspxhome.com