HashMap底层的实现

首先我们来看看HashMap的底层源码

/**
* Constructs an empty <tt>HashMap</tt> with the default initial capacity
* (16) and the default load factor (0.75).
*/
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}

我们可以看到底层其实就是一个数组,而且是一个Entry类型的数组,我们来看看Entry类的源码

static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
final int hash;
Entry<K,V> next;

它是一个静态内部类,成员变量有我们放进去的key,value以及指向下一个Entry对象的引用当我们调用put方法时

public V put(K key, V value) {
K k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);

for (Entry<K,V> e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

modCount++;
addEntry(hash, k, value, i);
return null;
}


它首先根据key值生成一个hash值,并通过以下方法

static int indexFor(int h, int length) {
return h & (length-1);
}


得到数组的存放位置,如果该位置已经有对象存在了,就顺着此对象的链开始寻找,如果e.hash == hash && eq(k, e.key)返回为真就用新的对象替换旧的对象并将旧的对象返回,如果都不成功,表示在链上不存在,这个时候就直接添加到数组,同时将添加的这个Entry的next指向被替换的那个Entry对象,实现如下

void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}

总的来说HashMap底层是用数组来实现,而每一个数组元素又可以当成一个链表的头,这样做是为了提高查询的效率,使得查找时间不会随Map的大小而改变
JDK1.8HashMap底层实现原理 hashmap是我们开发中用的最常见的集合之一,但是我们是否有了解过他的底层呢?这篇文章我将带您了解一下hashmap的底层 位运算 在学习hashmap底层原理的时候,我们必须要掌握位运算,别问为什么,往下面看自然知晓 ... 阅读详情

相关推荐

扫地机器人解决方案:工作原理与硬件构成

房间里柜子,鞋子,床,座椅,人都在什么地方?3、数字信号处理器。这主要是为控制芯片进行路径规划后,下发指令给执行的电机,包括舵轮(扫地机人前进,转向的轮子),扫地刷的电机,吸尘器的电机,让这些电机工作。扫地机器人的大脑主要用来规划路径,避障,以及人机交互,例如:人类设定打扫范围,以及语音指导扫地机器人进行打扫,都需要处理器进行处理后,将指令下发到执行机构。小脑属于跟执行层最近的控制区域,例如我们上面说的,后面两个处理器:数字信号处理器和微控制器都是对执行层(电机),进行控制和回馈外部信息的处理器。

迷途 7398

深入理解HashMap底层结构

深入理解HashMap知识点:一、HashMap(https://www.bilibili.com/video/BV1Z54y1e7id?p=1学习视频)1、概述二、Map继承图继承关系三、源码剖析Hash的存储结构1、HashMap数据结构2、HashMap类成员变量2.1、序列化版本号:集合可序列化2.2、 默认初始化容量(构造方法中可修改):162.3、 集合的最大容量:2的30次幂2.4、 默认负载因子(构造方法中可修改):决定已经使用容量达到多少时进行扩容,例如已使用的容量达到总容量的75%时进行

weixin_44987871的博客 3391

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5810

HashMap构造函数

此时n为0000 11xx xxxx xxxx ,则n无符号右移两位,会将最高位两个连续的1右移两位,然后再与原来的n做或操作,这样n的二进制表示的高位中会有4个连续的1。这样做的好处是,可以将hashCode高位和地位的值进行混合做异或运算,而且混合之后,地位的信息中加入了高位的信息,这样高位的信息就会被保留下来,掺杂的元素多了,那么生成的hash的随机性会增大。这次把已经有的高位中的连续的4个1,右移4位,再做或操作,这样n的二进制表示的高位中会有8个连续的1。表示获取最接近初始化值的2的次方值。

初学者 1668

[SystemC]SystemC中的模块和程序

SystemC 中的层次结构是使用类 sc_module 创建的。sc_module 可以直接使用,也可以使用宏 SC_MODULE “隐藏”。上面的示例 SC_MODULE 创建了一个名为 nand2 的 sc_module 类对象。它的输出纯粹是输入值的函数。因此,模型可以使用最简单的 SystemC 进程,即 SC_METHOD。摘要:本节包含一个完整的简单设计,用于演示 SystemC 中模块和流程的使用。同样,重要的是要注意这不是典型的设计风格 - 但它很好而且易于理解。为什么要看模块和流程?

元直的博客 1867

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4140

HashMap 的底层结构和原理

1. 讲讲 HashMap 的底层结构和原理 HashMap 就是以 Key-Value 的方式进行数据存储的一种数据结构嘛,在我们平常开发中非常常用,它在 JDK 1.7 和 JDK 1.8 中底层数据结构是有些不一样的。总体来说,JDK 1.7 中 HashMap 的底层数据结构是数组 + 链表,使用 Entry 类存储 Key 和 Value;JDK 1.8 中 HashMap 的底层数据结构是数组 + 链表/红黑树,使用 Node 类存储 Key 和 Value。当然,这里的 Entry 和 Nod

weixin_42814000的博客 8538

开关电源中的高频振荡噪声及其抑制方法

在开关电源的工作过程中,随着开关管的开关动作,电流和电压波形会出现剧烈的波动,尤其是在开关管切换的瞬间,往往会导致较强的过冲现象。开关电源中的高频振荡噪声是导致电磁兼容问题的主要源头之一,尤其是MOS管的通断和整流二极管的反向恢复过程中,会产生较强的高频振荡噪声。通过合理调节R和C的值,可以大大缓解高频振荡带来的EMC问题,从而有效提升电源的电磁兼容性。整流二极管反向恢复时的振荡会导致高频噪声产生,这些高频噪声源可被传导到电源的输出端,甚至可能通过电源的共地路径扩散到其他电路,影响系统的稳定性和可靠性。

硬核科技 1529

JDK1.7中的hashMap源码分析

JDK1.7中的hashMap 重要属性 /** * The default initial capacity - MUST be a power of two. * 默认初始化的容量,必须是2的幂 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity, used if a higher value is implicitly specified * by

weixin_43465227的博客 264

【C++】ROS:ROS1环境配置与基础示例

ROS1环境配置与基础示例

DevFrank的博客 2103

36、T5L 迪文屏C51开发之绘制动态曲线

T5L 迪文屏C51开发之绘制动态曲线1、介绍2、例程功能简介3、GUI界面设计3、C51程序设计 1、介绍   本文将利用DGUS Tool软件中的【动态曲线控件】来绘制曲线效果,在T5L迪文屏中总共支持8个通道的曲线,而曲线数据是需要缓冲区的,如果 8 通道曲线同时使用,0x1000-0x4FFF 将作为曲线缓冲区地址,此时该部分变量地址不能被其他控键使用,其他控键地址使用范围为0x5000-0xFFFF,当某曲线通道不被使用时,那么其所对应的缓冲区地址可以做其他用途,曲线通道具体的地址分布如下图所示:

嵌入式羊圈 3130

HashMap-1.8 之初始化容量与参数设置(源码分析)

阿里巴巴规范声明: 在使用HashMap是强制初始化容量, 其实就是为系统西能做优化,保证数据的安全性,但在实际初始化容量时,如何设定初始化容量值,最为合适呢?这里带你来分析···

qq_24691007的博客 1444

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

qq_40073899的博客 560

HashMap底层实现原理解析

一:HashMap底层实现原理解析 我们常见的有数据结构有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点: 1、数组结构: 存储区间连续、内存占用严重、空间复杂度大 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快) 缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。 2、链表结构:存储区间离散、占用内存宽松、空间复杂度小 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活

qq_43370771的博客 12万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HashMap底层实现原理

1 HashMap底层实现原理 1.1 底层使用的数据结构 JDK8之前:数组、链表 JDK8之后:数组、链表、红黑树 1.2 重要字段 transient int size; //当前存储的键值对总数 int threshold; //阈值,默认为16 final float loadFactor; //负载因子 transient int modCount; //HashMap被改变的次数,比如使用迭代器进行迭代时,如果其他线程对当HashMap //进行了修改,则会改变该字

qq_46329780的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Hashmap底层源码实现

基本属性 // 默认容量16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认负载因子0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 链表节点转换红黑树节点的阈值, 9个节点转 static final int TREEIFY_

weixin_51749366的博客 188

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HashMap底层实现原理详解

本文深入讲解了Java中HashMap的实现原理与特性。首先介绍了HashMap的基本概念和常用方法,包括put、get、remove等操作。然后分析了JDK7和JDK8中HashMap的区别,指出JDK8引入了红黑树优化性能。重点解析了HashMap的扩容机制和容量设计,包括默认负载因子0.75的合理性、扩容规则以及初始容量16的原因。最后比较了不同JDK版本下HashMap的结构变化,JDK7使用数组+链表,而JDK8优化为数组+链表+红黑树的结构,并改变了节点插入顺序。文章通过详细的源码分析和问题解答

Hai的博客 2万+

HashMap 的底层实现

HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。若遇到哈希冲突,则将冲突的值加到链表中即可。相比于 JDK1.8 的 hash 方法 ,JDK 1.7 的 hash 方法的性能会稍差一点点,因为毕竟扰动了 4 次。

宋发元 716

HashMap的底层实现原理

HashMap的底层是通过数组+链表(即哈希表)的结构来实现的。 HashMap的实例有两个参数影响其性能:初始容量 和 加载因子。 初始容量只是哈希表在创建时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目超出了加载因子与当前容量的乘积时,通过调用rehash方法将容量翻倍。 简单说下HashMap的工作原理: HashMap基于hashing原理,我们通过p...

tanwenfang的博客 4966

【底层实现】HashMap的底层实现原理

HashMap的put和扩容原理分析

qq_53662373的博客 5372

一文搞懂HashMap1.7、HashMap1.8的底层是如何实现的

摘要:本文深入探讨了HashMap相关技术要点,包括:1)equals与==的区别,String和包装类的特殊处理;2)重写equals必须重写hashcode的原因及哈希碰撞原理;3)HashMap与Hashtable的线程安全差异;4)JDK1.7(数组+链表)与1.8(数组+链表+红黑树)的底层实现差异;5)ConcurrentHashMap的分段锁优化;6)核心参数如加载因子0.75的作用;7)ArrayList与Vector的扩容机制对比;8)HashSet基于HashMap的实现原理。

gonghua0502的专栏 1249

Java 中HashMap的底层实现

为了实现均匀分布,哈希函数应该尽可能地将不同的键映射到不同的索引上,并且尽量减少碰撞(即不同的键产生相同的哈希值)的可能性。由于哈希函数能够将键均匀地分布到数组中,这意味着每个槽位上的链表或红黑树的大小大致相同,从而保证了查找操作的平均时间复杂度接近O(1)。具体来说,如果计算出的哈希值对应的槽位上已经有元素,新元素会被添加到该槽位上的链表或红黑树的末尾。:当需要查找一个键对应的值时,哈希函数会再次被用来计算键的哈希值,从而快速定位到数组中的正确位置。这样,每个键都会被映射到数组中的一个特定位置。

m0_60521228的博客 1059
上一篇: PL/SQL小例子
下一篇: java虚拟机基础知识
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值