首页 > 其他分享 >HashMap底层原理

HashMap底层原理

时间:2023-05-29 22:34:35浏览次数:38  
标签:存储 HashMap 数组 链表 键值 哈希 原理 底层

HashMap是Java中常用的数据结构之一,它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍:

1. 数据结构:HashMap底层使用数组和链表(或红黑树)的组合实现。它通过哈希算法将键转换为数组索引,并将值存储在对应索引位置上。

2. 哈希算法:当我们向HashMap中存储一个键值对时,HashMap会调用键的hashCode()方法来计算哈希码(hash code)。哈希码是一个整数,用于确定键值对在数组中的存储位置。

3. 数组存储:HashMap内部维护了一个Entry数组,用于存储键值对。数组的每个位置称为桶(bucket),每个桶可以存储一个或多个键值对。数组的初始大小为16,可以根据需要进行动态扩容。

4. 解决哈希冲突:由于不同的键可能生成相同的哈希码,可能会导致哈希冲突。当发生哈希冲突时,HashMap使用链表或红黑树来解决。在JDK 8之前,采用链表方式解决冲突;而在JDK 8及以后的版本,当链表长度超过一定阈值(默认为8)时,链表会自动转化为红黑树,以提高查找效率。

5. 键值对存储:HashMap的每个键值对被封装在一个Entry对象中,包含键、值和指向下一个Entry的指针(在链表中)。当存储一个键值对时,HashMap会根据哈希码找到对应的桶,然后在桶中查找键是否已存在。如果存在相同的键,则更新对应的值;否则,将新的键值对添加到桶中。

6. 键的查找:当我们根据键来获取值时,HashMap会根据键的哈希码找到对应的桶,然后在桶中遍历链表(或红黑树)进行查找。通过键的equals()方法比较键的值,找到匹配的键值对并返回对应的值。

7. 扩容机制:当HashMap中存储的键值对数量超过容量的75%(加载因子默认值)时,HashMap会自动进行扩容。扩容会创建一个更大的数组,并将所有键值对重新分配到新的桶中,以减少哈希冲突,保持查找性能的稳定。

8. 性能分析:HashMap提供了常数时间(O(1))的存储和检索操作,具有高效的性能。但在极端情况下,如果哈希码计算不均匀或出现大量的哈希

冲突,链表或红黑树的遍历操作可能会变为线性时间(O(n))。

总体而言,HashMap通过哈希算法将键值对分散存储在数组的不同位置上,通过链表或红黑树解决哈希冲突,并提供高效的存储和检索功能。合理选择哈希函数和适当调整加载因子可以提高HashMap的性能。

标签:存储,HashMap,数组,链表,键值,哈希,原理,底层
From: https://www.cnblogs.com/SuperGuoYa/p/17441874.html

相关文章

  • jwt介绍和原理 JWT认证
    目录一、cookie,session,token发展历史jwt:二、base64编码和解码基本使用base64的用途小练习三、JWT认证一、cookie,session,token发展历史-会话管理-cookie:客户端浏览器的键值对-session:服务的的键值对(djangosession表,内存中,文件,缓存数据库)-token:服务的生成的加密字符串,如果......
  • jwt原理,jwt开发流程,drf-jwt快速使用,drf-jwt定制返回格式,drf-jwt自定义用户表签发,drf-j
    jwt原理:  JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串1headerjwt的头部承载两部分信息:声明类型,这里是jwt声明加密的算法通常直接使用HMACSHA256公司信息......
  • jwt原理开发,drf-jwt快速使用和自定义使用,jwt签发认证源码分析
    一眼弄懂cookieSeesiontoken区别彻底弄懂cookie,session和token区别1jwt原理1.1使用jwt认证和使用session认证的区别1.2三段式eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEf......
  • hdu 3303(线段树+抽屉原理)
    解题思路:这题利用了抽屉原理,即1-M之间的所有数与M+1的模都不相同。那么可以利用它将要查找所有区间分成[1,Y-1],[Y,2*Y-1],[2*Y,3*Y-1].........一直下去,直到所有的区间都被找一遍,然后就是保存最小的模即可。。。这样就肯定要找每个区间的最小的模,实际上这里可以利用线段树去找,只需......
  • hdu 5201(隔板法+容斥原理)
    TheMonkeyKingTimeLimit:8000/4000MS(Java/Others)    MemoryLimit:65536/65536K(Java/Others)ProblemDescriptionnpeaches.Andtherearemmonkeys(includingGoKu),theyarenumberedfrom1tom,GoKu’snumberis1.GoKuwa......
  • 转载-奇小葩-深入ftrace kprobe原理解析
    原文链接:https://blog.csdn.net/u012489236/article/details/127942216 Linuxkrpobe调试技术是内核开发者专门为了编译跟踪内核函数执行状态所涉及的一种轻量级内核调试技术,利用kprobe技术,内核开发人员可以在内核的绝大多数指定函数中动态插入探测点来收集所需的调试状态信......
  • 转载-奇小葩- 深入ftrace uprobe原理和功能介绍
    原文链接:https://blog.csdn.net/u012489236/article/details/127954817 上一章我们学习了,kprobe可以实现动态内核的注入,基于中断的方法在任意指令中插入追踪代码,并且通过pre_handler/post_handler去接收回调。另一个kprobe的同族是kretprobe,只不过是针对函数级别的内核......
  • 3.4 流水线的通用原理
    流水线化的一个重要特性就是提高了系统的吞吐量,不过会轻微增加延迟。计算流水线在现代逻辑设计中,电路延迟以微微秒或皮秒,也就是10的负12次方秒为单位进行计算。假设将系统执行的计算分为三个阶段,每个阶段需要100ps,然后在每个阶段之间放上流水线寄存器,流水线寄存器的延迟为20ps,这......
  • Java中如何获得A<T>泛型中T的运行时类型及原理探究(转)
    原文:https://developer.aliyun.com/article/1226646简介如果经常写工具类,很大概率会遇到一个比较实际的问题,就是需要在泛型表达式A中获取T的运行时类型。获取它需要一些技巧。但这个技巧很少被透彻的解释过为什么会生效。在接下来的文章里,我们会从Java的泛型(Generics)谈起,结合JLS......
  • 【2023 · CANN训练营第一季】基于Atlas 200I DK A2的智能小车结构设计和控制原理
    基于Atlas200IDKA2的智能小车结构设计和控制原理一、结构设计基本原则从零开始设计并搭建智能小车,在满足外观要求的基础上,要满足小车运转过程中的运动干涉率为0,并且需要考虑实际安装时的易用性与可行性,以及智能小车的重心位置的控制等。主要模块前中后外壳结构支撑模块。TT减速......