HashMap之总结

一篇搞懂HashMap,手写HashMap 手撕HashMap 阅读详情

HashMap

众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry(Java7叫Entry,Java8中叫Node)。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。

如图,HashMap数组中的每一个元素的初始值都是Null。

在这里插入图片描述

对于HashMap,我们最常使用的是两个方法:Put 和 Get。

1.Put方法的原理

因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。

现在比如hashMap.put(“apple”,520),我插入了为"apple"的元素,这个时候我们会通过哈希函数计算出插入的位置,假定最后计算出的index是2,那么结果如下:

在这里插入图片描述

因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也难免会出现index冲突的情况。

在这里插入图片描述

像上面这样有极端情况两个key也会hash到一个值上,那就形成了链表。HashMap数组的每一个元素不止是一个Entry对象,也是一个链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时,只需要插入到对应的链表即可。java8之前是头插法,就是说新来的值会取代原有的值,原有的值就顺推到链表中去,就像上面的例子一样,因为写这个代码的作者认为后来的值被查找的可能性更大一点,提升查找的效率。但是,在java8之后,都是所用尾部插入了。

2.Get方法的原理

首先会把输入的Key做一次Hash映射,得到对应的index:

index = Hash(“apple”)

由于刚才所说的Hash冲突,同一个位置有可能匹配到多个Entry,这时候就需要顺着对应链表的头节点,一个一个向下来查找。假设我们要查找的Key是"apple":

在这里插入图片描述

第一步,我们查看的是头节点250,Key是iphone,显然不是我们要找的结果。

第二步,我们查看的是Next节点520,Key是apple,正是我们要找的结果。

之所以把250放在头节点,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。

1. HashMap的默认初始化长度是16。

在JDK1.8的 236 行有1<<4就是16

在这里插入图片描述

我们在创建HashMap的时候,阿里巴巴规范插件会提醒我们最好赋初值,而且最好是2的幂。

在这里插入图片描述

这样是为了位运算的方便,位与运算比算数计算的效率高了很多,之所以选择16,是为了服务将Key映射到index的算法。所有的key我们都会拿到他的hash,我们通过Key的HashCode值去做位运算。

有如下的公式(Length是HashMap的长度):

index = HashCode(Key) & (Length - 1)

下面我们以值为“book”的Key来演示整个过程:

1.计算book的hashcode,结果为十进制的3029737,二进制的101110001110101110 1001。

2.假定HashMap长度是默认的16,计算Length-1的结果为十进制的15,二进制的1111。

3.把以上两个结果做与运算,101110001110101110 1001 & 1111 = 1001,十进制是9,所以 index=9。

可以说,Hash算法最终得到的index结果,完全取决于Key的Hashcode值的最后几位。

文章中有借鉴"[敖 丙]"、"[程序员小灰]"的文章内容。

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南 本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。 阅读详情

相关推荐

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1332

HashMap的内部类Node与Map的内部类Entry的关系以及Node与Entry、EntrySet三者之间的关系

Entry这个集合中包含两类,一类是Set类型的KeySet,用来存放Key值,另一类是存放在value值,然后他们里边各自的值存放的是地址,一个指向真正Node节点的key和value的地址;

小爽帅到拖网速的博客 5733

MacX DVD Ripper Pro for Mac(DVD解码器) 6.2.120190416免激活版

只需要5分钟即可转档一张DVD光碟!并允许我们在编码之前预览、编辑、裁剪、修剪或扩展视频。第一款也是唯一一款能够支持DVD到MP4,H.264,MOV,FLV,MPEG4等所有格式DVD(新DVD,99-标题DVD,损坏和无法播放的DVD)和翻录DVD / ISO映像的工具,AVI,QT,MP3等。借助350多种预设配置文件MacX DVD Ripper Pro for Mac(DVD解码器) 6...

llhf688的博客 891

map.entry和entry区别

Entry是HashMap中的另一个内部类,也用于表示哈希表中的一个节点。它与Node类似,也包含了键值对的key和value,以及指向下一个节点的指针。不同的是,在Java 8中,HashMap中的节点类型被改为了Entry。Node是HashMap中的一个内部类,用于表示哈希表中的一个节点。其中,Node和Entry都是HashMap中的内部类,用于表示键值对。因此,Node和Entry的区别在于它们在不同版本的Java中的使用方式不同,但它们的作用和含义是相同的。

weixin_43613968的博客 1382

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南)

本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。

x1y2z的博客 1163

企业 IoT 产品安全渗透测试与欧盟 CRA 合规落地实战指南

欧盟 CRA(网络弹性法案)2026-09-11 漏洞报告义务生效,2027-12-11 全面强制产品安全不再是"加分项",而是市场准入的法律门槛本文面向 IoT 企业安全工程师/运维工程师,讲清楚如何从零建立渗透测试能力,并与 CRA 合规要求对齐落地。不讲空话,全是可执行的步骤。IoT 企业安全工程师、运维工程师负责产品合规的技术人员想从"被动响应"转向"主动安全"的团队[ ] 能独立完成 Web 应用渗透测试并输出报告[ ] 能对 REST/GraphQL API 进行安全评估。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 270

[Java] Node和Entry

关于Node和Entry的总结与分析 涉及到的接口和类: Map.Entry接口 注意:这里的Map是一个接口,而我们的Map.Entry也是一个接口,这个时候就说明了我们的Map.Entry接口是Map接口中的一个内部接口 不仅可以有内部类,也可以有内部接口 HashMap.Node类 LinkedHashMap.Entry类 TreeMap.Entry类 Hashtable.Entry类 这几个API的使用位置和作用: HashMap.Node作为HashMap的底层存储单元 我们创

m0_57001006的博客 3937

STMicroelectronics 系列:STM32G4 系列_(11).STM32G4系列编程基础

通过本文,我们学习了如何在 STM32CubeIDE 中搭建开发环境,创建新项目,配置 GPIO、定时器和 ADC 外设,并编写相应的代码示例。这些基础知识将帮助你快速上手 STM32G4 系列的编程。希望本文对你有所帮助,祝你编程愉快!

2401_87715305的博客 1279

浅读HashMap

什么是HashMap? HashMap是Java的一个集合容器. 用于存储Key-Value对 HashMap的应用场景 假定如下场景:记录张三,李四,王五三位同学的成绩. 这时候我们有必要去做一个实体类内部包含姓名和成绩两个字段吗? 没有必要的. 完全可以利用HashMap. 存入: Map<String,double> map=new HashMap(); map.put("张三",60.0); map.put("李四",80.5); map.put("王五",79); 取出: doubl

LwinnerG的博客 598

如何给数据添加高斯白噪声?

首先测试集应该是加噪声的,至于训练集需不需要加噪声就见仁见智了。我个人测试的结果是,训练集如果不加噪声的话效果特别差,如果加噪声的话效果就比较好接受,大家可以自己试试看。在轴承故障研究中免不了要涉及到给数据主动加入噪声的情况,一般我们加的是高斯白噪声。由于热噪声是由大量自由电子的运动产生的,其统计特性服从高斯分布,故常将热噪声称为高斯白噪声。的频谱是均匀分布的,好像白光的频谱在可见光的频谱范围内均匀分布那样,所以热噪声又常称为。定义一:如果一个噪声,它的瞬时值服从。又是均匀分布的,则称它为高斯白噪声。

weixin_50642818的博客 5220

Redhawk: 为什么STA CHECK中switch cell覆盖率为0(STA file中switch control pin没有timing window)?

如题,做dynamic analysis时,不需要switch cell的timing window信息,但是做low power analysis需要做上电时switch cell的timing window就是必须的了,本文对switch cell control pin没有timing window (STA CHECK覆盖率为零)的这种现象做分析。

m0_61544122的博客 1197

HashMap(底层实现原理)、红黑树(平衡二叉树)

Java集合 1、Java常见的容器 常见的容器主要包括collection和Map两种,Collection存储对象的集合 Map存储着键值对(两个对象)的映射表 ,hashmap里面底层数据结构实现是:entry数组、node数组、链表/红黑树 entry和node都含key、value、hash、next属性 HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 HashMap 是无序的,即不会记录插入的

weixin_43889487的博客 3060

【学习系列】SAP RAP 22:Excel文件上传和读取(非扩展&扩展方式)

本文介绍了在RAP中实现Excel文件上传处理的三种方法:1) 使用@Semantics.largeObject注解实现简单上传下载,但限制在ObjectPage页面使用;2) 通过自定义action弹窗实现上传功能,但存在无法自动刷新列表等限制;3) 结合CustomUIExtension实现更灵活的完整功能,但需要UI5开发技能。文章详细说明了每种方法的实现步骤,包括数据库表设计、注解配置、前端界面开发和后端处理逻辑,并比较了各自的优缺点。最后通过一个处理不同币种数据的示例,展示了如何实现业务处理逻辑。

DeveloperMrMeng的博客 626

什么是HashMap?什么情况下使用HashMap?

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【什么是HashMap?什么情况下使用HashMap?】 大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务十的一个知识点:什么是...

IT修真院:初学者转行到互联网的聚集地 7639

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

聂可以的博客 2249

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【HashMap】

HashMap简单概括

weixin_52553065的博客 2087

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

详解 HashMap扩容机制,HashMap的底层原理以及HashSet在底层原理

利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样利用什么机制保证去重?**利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样。

Java技术加油站的博客 2112

HashMap详解

本文主要介绍了Java集合框架中HashMap的相关知识,包括源码分析、hash 原理、扩容机制、加载因子、线程不安全等内容。

专注Java和MySQL领域知识分享 1686

HashMap深入讲解

摘要: HashMap是Java中基于哈希表的Map实现类,允许null键值且不保证顺序。其底层采用数组+链表/红黑树结构,默认容量16,负载因子0.75(平衡空间与时间效率)。HashSet实际通过HashMap实现。关键特性包括:key需重写equals()和hashCode(),value需重写equals();当链表长度>8且数组容量≥64时转为红黑树。put操作先计算key的hash值(通过hashCode()高16位异或),再处理哈希冲突。构造方法可自定义初始容量和负载因子。

1359

面试手写HashMap,手撕HashMap

前言: 现在面试时,面试官经常会问到HashMap,简单点就会问下HashMap的一些关键知识点,困难些的可能会当场让你手写一个HashMap,考察下你对HashMap底层原理的了解深度;所以,今天特别手写了一个简单的HashMap,只实现了 put、get、containsKey、keySet 方法的 HashMap,来帮助我们理解HashMap的底层设计原理。 本文...

木子雷的博客 2220

JAVA之HashMap详解

HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。jdk1.8 之前 HashMap 由数组 + 链表组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存在的(“拉链法”解决冲突)。

励志成为一名优秀的全能型软件开发工程师。 2328

HashMap原理

HashMap是基于哈希表的键值对存储结构,采用数组+链表+红黑树解决哈希冲突。核心通过键的hashCode计算哈希值,使用(n-1)&hash确定数组索引位置。默认容量16,负载因子0.75,超过阈值会扩容2倍。Java8优化了哈希扰动函数,将高16位与低16位异或,使分布更均匀。当链表长度超过8且数组容量≥64时,链表转为红黑树;节点数低于6时转回链表。put方法先检查桶是否为空,为空则直接插入;否则处理冲突,匹配则更新,不匹配则链式存储或树化。

猫狗鼠鱼的储物间 1096

HashMap 详解

本文深入解析Java中HashMap的核心特性、底层数据结构及哈希冲突处理机制,涵盖自定义类型作为key的处理、手写HashMap实现及Java8后的优化,通过源码分析揭示哈希表扩容与性能优化策略,助你掌握高效数据管理与操作技巧。

m0_73941339的博客 1423

Java HashMap

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hashMap 中。

2401_88984449的博客 1101

HashMap、创建并遍历HashMap集合、LinkedHashMap

HashMap是基于哈希表的Map实现。键是哈希表结构,可以保证键的唯一性。 HashMap 继承于AbstractMap,实现了Map接口。 HashMap的设计初衷主要是为了解决键值(key-value)对应的关联的,HashMap的优势是可以很快的根据键(key)找到该键对应的值(value)。注意一下,HashMap是一种无序的存储结构。 遍历 1.案例1 键String类型,值S...

元气满满晨 1万+

HashMap

如果这和个位置上有多个元素,还需要用key的equals方法在对应位置的链表中找到需要的元素,通常equals方法一般都会根据实际的业务内容来定义。这里适用位运算,所以上面的capacity要是2的次方,因为2的次方减1得到一个全1的二进制数,做and操作就会保证索引的均匀性,否则加入某一位是0,那么这一位就永远不会在索引中出现。如果key为null,会存放在索引为0的entry,但是这个entry不一定只有key为null的value,所以需要遍历所有的entry,返回key为null的value。

weixin_43991255的博客 862
上一篇: @JsonFormat与@DateTimeFormat注解的使用
下一篇: MyBatis-Plus使用心得
perfei焓
博客等级 码龄8年 32粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值