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 中的实现如下图所示:
在 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 时,为了节省内存空间会将红黑树退化为链表。
来源:https://juejin.cn/post/7234467007718391868


猜你喜欢
- jar包打包实现jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的
- 一、RESTful风格API的好处API(Application Programming Interface),顾名思义:是一组编程接口规范
- 这篇文章主要介绍了java的package和import机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- Unity Shader学习:水墨效果偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法
- 1.springboot 2.0 默认连接池就是Hikari了,所以引用parents后不用专门加依赖2.贴我自己的配置(时间单位都是毫秒)
- 本文实例讲述了Java访问WebService返回XML数据的方法。分享给大家供大家参考。具体如下:import java.io.IOExc
- 本文实例为大家分享了java实现猜拳游戏的具体代码,供大家参考,具体内容如下package com.farsight.session7;im
- 任何简单操作的背后,都有一套相当复杂的机制。本文将以SpringBoot应用的在Docker环境下的打包部署为例,详细讲解如何使用Jenki
- Java 17 更新了,作为一个 10 年的 Java 程序员,还是有亿点点兴奋的,Kotlin 的群里面也是各种讨论 Java 的新特性。
- 1、spring原理内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其
- 前言当同一类型的很多对象组成一个树结构的时候,可以考虑使用组合模式,组合模式涉及三个类:Component接口:定义树的各个节点的一些操作L
- RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应
- 推荐阅读:浅析Android手机卫士sim卡绑定深入浅析Android手机卫士保存密码时进行md5加密详解Android 手机卫士设置向导页
- java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法:1) 传统方法假设有某个类如下&n
- 屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用
- 前段时间分享了《阅读跟踪 Java 源码的几个小技巧》是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧。所
- 传统“长轮询”实现Web端即时通讯的问题WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。
- 前述园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少
- 本文实例为大家分享了DigitalClock实现商品倒计时的具体代码,供大家参考,具体内容如下自定义DigitalClock控件:packa
- 一、基本使用使用示例:// 初始化BigDecimal bd1=new BigDecimal("456");BigDec