HashMap小结

HashMap CRUD操作 用HashMap实现对产品的CRUD操作,和适合初学者研究。 立即下载
  • hahmap数据结构

JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低;

JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间

JDK7和8中的区别

一句话:JDK 8的HashMap主要优化在于引入红黑树解决哈希冲突性能问题,改用尾插法避免多线程死循环,并优化了扩容机制

  1. 首要区别:JDK 8引入了红黑树,当链表过长时(>8且数组容量>=64)会转为红黑树,防止哈希碰撞攻击,将最坏情况下的查询性能从O(n)提升到O(log n)。

  2. 插入方式:JDK 7使用头插法,在多线程扩容时可能产生死循环;JDK 8改为尾插法,解决了这个问题。

  3. 扩容优化:JDK 8扩容时通过(e.hash & oldCap)判断节点新位置,无需重新计算哈希,性能更好

  • HashMap中CRUD操作的底层实现原理是什么?

PUT

1. 通过key计算出一个hashcode
2. 通过hashcode与“与操作”计算出一个数组下标
3. 在把put进来的key,value封装为一个entry对象
4. 判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位
置
5. 如果该下标对应的位置不为空,则需要把entry插入到链表中
6. 并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
7. 如果是JDK7,则使用头插法;如果是JDK8,则会遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中

头插法:冲突的时候,将后面插入的元素放到链表的头部;

GET


  •    JDK8中链表转变为红黑树的条件?

1. 链表中的元素的个数为8个或超过8个
2. 同时,还要满足当前数组的长度大于或等于64才会把链表转变为红黑树。为什么?因为链表转变为红黑树的目的是为了解决链表过长,导致查询和插入效率慢的问题,而如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题。所以在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。

红黑树本质是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。加快检索速率

  • hashMap中的hash()

在hashmap中要找到某个元素,需要根据key的hash值来求得对应数组中的位置。如何计算这个位置就是hash算法。

  • 为什么HashMap的数组的大小是2的幂次方数?

hashmap在进行CURD的时候要首先使用确定index,index = (n -1)&hash;根据以上公式,n不为2的幂次方数时,出现hash碰撞的概率大大增加,因此数组长度必须为2的幂次方数。        

退一步讲:为什么使用index = (n -1)&hash?

获取index的逻辑仅需要保证,元素均匀分布,尽量避免hash冲突即可。当n为2次幂时,会满足一个公式:(n - 1) & hash = hash % n;而且hash时采用了二进制的位运算来提高计算速度,而不是使用常规的取模;

  • 在高并发大流量的情况下,hashMap有什么问题吗,会不会造成cpu达到100%?如果会,那是在哪一步可能会出现这个问题呢(插入、删除、查找、扩容)?

jdk1.7中会造成,原因:插入元素的时候使用头插法,后面扩容的时候也先从头部获取元素

扩容前链表中元素顺序 :A---->B

扩容前链表中元素顺序 :B---->A

扩容为多步操作:数组扩容、元素转义,因此当多线程操作的时候,假如线程1完成了数组扩容,此时元素顺序 :A---->B,此时线程上下文切换;线程2完成了数组扩容、元素转义两步操作,链表中元素顺序 :B---->A。那么就会出现互相指向。

而 JDK 1.8 时已经变成了尾部插入


     当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组的搬移到新的数组中。
 

参考文章:

HashMap与红黑树_Lin_Dong_Tian的博客-优快云博客_hashmap红黑树
hashmap hash冲突怎么解决_HashMap原理_徐一僧的博客-优快云博客
详解 HashMap 中的 hash 函数_得一的博客-优快云博客_hash函数
为什么hashMap的容量扩容时一定是2的幂次_平凡之路无尽路的博客-优快云博客_hashmap容量为什么是2的幂次hh


Java8中为什么使用红黑树?-技术圈




 

STM32F103移植NuttX实战:从零搭建最小系统到串口Shell(附完整配置文件) 本文详细介绍了在STM32F103C8T6开发板上移植NuttX实时操作系统的完整过程,包括环境搭建、BSP配置、系统时钟初始化、驱动裁剪、编译烧录及串口Shell交互。通过实战指南帮助开发者快速掌握NuttX移植技巧,解决典型问题,适用于嵌入式系统开发。 阅读详情

相关推荐

OpenVins解析:基于滤波框架的SLAM

这一方式存在的关键问题是匹配耗时很长,对性能影响显著。可以参考ORBSLAM3中的匹配方式来对其优化,比如左右目匹配可以在极线上搜索,前后帧可以利用运动先验投影匹配。理论上加入路标点会提升精度,代价是增加了计算量。着重说下基于描述子的匹配:OpenVins中匹配的方式是robust_match(),里面是调用的opencv的。openvins中不仅仅进行了传统的MSCKF更新(状态向量中不包含路标点),还在。中进行了包含路标点的估计更新。图像帧到来时,利用IMU递推得到的位姿给该图像帧赋初值。

qq_18076309的博客 4074

Java中HashMap的常用操作

1.定义哈希并给其赋值 HashMap<Integer, Integer> hashMap = new HashMap<>(); hashMap.put(5, 2); hashMap.put(9, 2); hashMap.put(8, 1); hashMap.put(7, 3); hashMap.put(16, 1); hashMap.put(10, 2);.

zlq_优快云的博客 1278

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

OV-DINO的出现标志着在开放域目标检测领域的重大进步,其在处理未见过的物体类别时的能力得到了显著提升。这项技术对于需要适应未知或变化环境的应用具有重要意义,如自动驾驶、机器人视觉、安防监控等。

DeepAIedu的博客 2630

HashMap的实现方式

当程序执行 Map map = new HashMap(); 的时候,会先执行HashMap的默认无参数构造方法 public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } 这里的DEFAULT_INITIAL_CAPACITY是指新建HashMap的初始容量大小,默认是static...

hinsli的博客 2530

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2543

实战解析:如何通过LTspice仿真优化MOS管缓启动电路,解决上电冲击电流问题

本文详细解析如何通过LTspice仿真优化MOS管缓启动电路,有效解决上电冲击电流问题。文章从问题根源分析入手,介绍LTspice环境搭建、缓启动电路设计原理、参数优化技巧及实际工程问题排查,帮助工程师掌握MOS管电源开关电路的关键设计方法,提升系统可靠性和性能。

weixin_28683689的博客 515

hashmap算法h & (length-1)详解

hashmap中的数据结构是数组+链表,如下图所示 transient Entry[] table; 内部存储Entry数组,Entry有个next成员变量形成链表 当put一个键值对时,首先会根据key计算得出一个hash值,然后需要分配到某个数组的某个下标index,这个地方最简单的就是根据数组长度取模运算(%)但是hashmap使用了效率更高的方式计算index,代码如下 h & (length-1) 使用计算得出的hash值&(length-1),那么这里按位与运算必须保证每个

qq_31086797的博客 3017

深入解析 TDA4VM/VH R5F 核中断机制:VIC 与非 VIC 模式下的实战对比与优化

本文深入解析了TI TDA4VM/VH平台中ARMv7-R架构R5F核的两种中断处理机制:VIC模式与非VIC模式。通过对比硬件自动跳转与软件向量表分发的核心流程、实战代码示例及性能差异,为开发者提供了基于实时性、灵活性与调试需求的选择指南和优化建议,帮助构建更稳定的嵌入式系统。

weixin_29159441的博客 98

3.CRUD操作

CRUD操作 select 根据id查询 1.在UserMapper中添加对应方法 User selectUserById(int id); 2.在UserMapper.xml中添加对应的sql语句 <select id="selectUserById" resultType="com.dream.pojo.User"> select * from user where id = #{id} </select> 3.测试 @Test public void

我就要用HashMap的博客 239

3.摄像头组件- CVP (ISP)

本文介绍 车载摄像头组件-ISP

2401_83458819的博客 1617

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 203

HashMap学习小结

hashmap学习记录小结 WHAT: 数据结构是数组+链表。 链表存储的是一个entry对象。entry对象存着四个属性(hash,key,value,next) 整体是一个数组; 数组的每一个位置是一个链表; 链表的每个节点中的value是我们存储的对象 HOW: 工作原理 new HashMap; 有参和无参构造。无参构造,容器默认的数组大小initialCapacity是16,加载因子localFactory是0.75。所以这个容器的阈值是initialCapacitylocalFactory =

dasdadasdasdasdsad的博客 193

【我的Android进阶之旅】异常: Problems reading data from Binary store in Local\Temp\gradlexxx.bin (exist: true)

一、异常描述 今天开个会议,电脑自动关机了,重启电脑之后,打开Android Studio,编译代码,就编译失败,如下所示:异常提示 : Caused by: java.lang.RuntimeException: Problems reading data from Binary store in C:\Users\000\AppData\Local\Temp\gradle6337489649031706149.bin (exist: true) Caused by: java.lang.Runtime

字节卷动 3822

HashMap 使用小结

本文重点介绍HashMap。首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。在下文中会有例子具体说明。再来看看HashMap和TreeMap有什么区别。HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个

技术天地 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HashMap 知识小结

1.HashMap 数据结构 JDK1.7:数组+链表 数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。 JDK1.8:数组+链表+红黑树 当链表过长,则会严重影响 HashMap 的性能,红黑树搜索时间复杂度是 O(logn),而链表是糟糕的 O(n)。 当链表超过 8 且数据总量超过 64 才会转红黑树。 将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。 数.

刘梦娇 372

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

hashmap小结

问题: 1.hashmap底层实现原理?数据结构? 2.size为什么是2的n次幂? 3.put实现? 4.hashmap为了解决hash冲突做了哪些事情? 5.扩容机制? 6.扩容之后,新旧table数组数据怎么迁移?迁移过程中做了哪些操作保证了node的均匀分布? 解答: 计算key的hashcode(hash值计算采用的是高16位和hah与或^操作,为了让高16位也参与hash算法,目的是为了让node分布均匀,减少hash冲突的概率), 1.计算key在tabl...

qq_37661550的博客 208

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 关系型数据库百万级数据导入、分析计算等场景
下一篇: JMM以及三大特性
Learning_foolish
博客等级 码龄9年 14粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值