HashMap底层原理

devtools/2024/11/27 6:22:05/

jdk1.8之后hashmap底层结构

jdk1.8之后,是哈希表数据结构,也可以说是数组+链表或红黑树,下图是没有添加数据的一个hashmap。

37a22dcf419044ff8ca60494bcd81b8c.png

现在开始添加数据,看下面具体步骤

put操作

        如下,我们来简单看看hashmap的put源码,关注putVal的前三个参数就行,当增加一对key、value的时候,底层会做哈希运算,hash(key),它会将你的key映射到上面数组的某个位置。

1. 如果这个位置没有值,直接插入。

2. 如果有值,代表发生了哈希冲突,这时候又要分两种情况,key相同就覆盖,不同就放入链表或红黑树,也许你不懂为什么是链表或者红黑树,接着往下看。

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}

        如下图,红色是我们插入的值,4个连续红色的就是发生了哈希冲突,key不相同,就形成了链表。这里链表的插入是尾插法

85e076836ecd4cf8942d8f7067ed0aae.png

        而当链表的长度>=8并且数组长度>=64后,这个链表才会转化为红黑树。转化操作看起来很麻烦费事,其实大大提升了hashmap的查找效率,假如我们在数据量大的时候不转为红黑树,一条链表挂得很长,那么查该链表里面某个数据的时间复杂度就是O(n),如果是红黑树,时间复杂度就是O(log n)。d6ff9a1e8c3d4892aa8c965930cf1a29.png     

get操作

        例如hashmap.get(key),此时底层就会根据key计算哈希值,找到底层数组下标位置,如果是链表,依次对比key是否一样。如果是红黑树,根据红黑树进行查找对比。

jdk 1.7 之前hashmap底层原理

        只说和1.8之后不一样的地方。

1. 底层是数组加链表,也就是拉链法,没有红黑树。

2. 链表的插入是头插法


http://www.ppmy.cn/devtools/136511.html

相关文章

基于YOLOv8深度学习的智慧农业果园果树柑橘类果实目标检测系统(PyQt5界面+数据集+训练代码)

近年来,随着人工智能和物联网技术的迅速发展,智慧农业已逐渐成为现代农业发展的核心方向之一。在这一领域,目标检测技术因其在精准农业中的广泛应用前景,尤其是在果园果树管理中的显著作用,而备受关注。果树的果实检测…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

Linux: C语言解析域名

在上一篇博客 Linux: C语言发起 DNS 查询报文 中&#xff0c;自己构造 DNS 查询报文&#xff0c;发出去&#xff0c;接收响应&#xff0c;以二进制形式把响应的数据写入文件并进行分析。文章的最后留下一个悬念&#xff0c;就是写代码解析 DNS answer section 部分。本文来完成…

Spring Boot OA系统:企业资源规划的新选择

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【UE5】使用基元数据对材质传参,从而避免新建材质实例

在项目中&#xff0c;经常会遇到这样的需求&#xff1a;多个模型&#xff08;例如 100 个&#xff09;使用相同的材质&#xff0c;但每个模型需要不同的参数设置&#xff0c;比如不同的颜色或随机种子等。 在这种情况下&#xff0c;创建 100 个实例材质不是最佳选择。正确的做…

【Next】中间件

概述 Next.js 的 中间件 (Middleware) 是一种在请求完成之前运行的函数&#xff0c;用于对入站请求进行处理和操作。它可以在路由匹配前执行逻辑&#xff0c;用于身份验证、请求重写、重定向、设置响应头等任务。 使用场景 身份验证&#xff1a;在用户访问页面前检查登录状态…

天润融通携手挚达科技:AI技术重塑客户服务体验

业务爆发式增长&#xff0c;但座席服务却跟不上&#xff0c;怎么办&#xff1f; 智能充电领导者的挚达科技就面临过 这样的问题&#xff0c;让我们来看看如何解决。 2010年以来&#xff0c;国内新能源汽车市场进入高速发展期&#xff0c;作为新能源汽车的重要配件&#xff0c…

Java与Kotlin在鸿蒙中的地位

在当今移动操作系统领域&#xff0c;华为推出的鸿蒙系统&#xff08;HarmonyOS&#xff09;正逐渐崭露头角&#xff0c;成为与Android、iOS并驾齐驱的操作系统之一。对于开发者而言&#xff0c;了解如何为鸿蒙系统开发高质量的应用程序变得至关重要。在这篇文章中&#xff0c;我…