十分钟快速掌握HashMap底层实现原理(图文详解)

article/2025/11/9 10:23:50

HashMap概述

HashMap实现了Map接口,我们常用HashMap进行put和get操作读存键值对数据。下面介绍基于jdk1.8深入了解HashMap底层原理。

开始之前,记得点赞收藏加关注哦 ,需要下载PDF版本和获取更多知识点、面试题的朋友可以点一点下方链接免费领取

链接:点这里!!! 799215493 暗号:CSDN

在这里插入图片描述

HashMap数据结构

HashMap实际是一种“数组+链表”数据结构。在put操作中,通过内部定义算法寻止找到数组下标,将数据直接放入此数组元素中,若通过算法得到的该数组元素已经有了元素(俗称hash冲突,链表结构出现的实际意义也就是为了解决hash冲突的问题)。将会把这个数组元素上的链表进行遍历,将新的数据放到链表末尾。

在这里插入图片描述

存储数据的对象

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

我们从jdk1.8源代码看出存储对象Node实际是实现Map.Entry对象接口。

hash:通过hash算法的出来的值。hash值的算法我们看下HashMap源代码的实现

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

不同的数据类型的hashCode计算的方法不一样,我们看下String和Integer两种数据类型的hashCode算法

String.hashCode()

public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}

通过将字符串转换成char数组,使用公式s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]进行计算得出最后的值。val[i]值是对应字符的ASCII值.在看到这里的时候,这里为什么使用了一个31作为相乘因子(能为啥,还不是为了性能考虑,那为什么使用31性能能得到优化呢),这里可以延伸讨论。

Integer.hashCode()

public static int hashCode(int value) {return value;}

直接返回值.

key:存储数据的key

value:存储数据的value

next:下一个数据,出现哈希冲突时,该数组元素会出现链表结构,会使用next指向链表中下一个元素

对象链表结构导致的问题

通过哈希算法从寻止上能够高效的找到对应的下标,但是随着数据的增长,哈希冲突碰撞过多。在寻找数据上,找到该来链表,会通过遍历在寻找对应数据,如此将会使得get数据效率越来越低。在jdk1.8中,链表元素数量大于等于8将会重组该链表结构形成为“红黑树结构”,这种结构使得在hash冲突碰撞过多情况下,get效率比链表的效率高很多。

HashMap put存储数据是如何处理的

HashMap有几个重要的变量

transient Node<K,V>[] table;
int threshold;
final float loadFactor;
int modCount;  
int size;

table:存储数组的变量,初始长度为16通过源代码看出在第一次进行resize扩容(java是静态语言,在定义数组初始化时,需要定义数组的长度,在map数据增长后,内部机制会进行重新定义一个数组做到扩容的操作)初始化时,会将默认静态变量

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

赋给数组长度进行初始化。

loadFactor:数据的增长因子,默认为0.75。在进行扩容操作会使用到。

threshold:允许的最大的存储的元素数量,通过length数组长度*loadFactor增长因子得出

modCount:记录内部结构发生变化的次数,put操作(覆盖值不计算)以及其他…

size:实际存储的元素数量

put的流程

直接通过源代码分析

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;// 判断数组是否为空,长度是否为0,是则进行扩容数组初始化if ((tab = table) == null || (n = tab.length

http://chatgpt.dhexx.cn/article/jTJUOB1Z.shtml

相关文章

HashMap底层实现原理及面试题

文章目录 1. 常见的数据结构有三种结构1.1 各自数据结构的特点 2. HashMap2.1 概述2.2 底层结构2.2.1 HashMa实现原理&#xff1a;2.2.1.1 map.put(k,v)实现原理2.2.1.2 map.get(k)实现原理2.2.1.3 resize源码 2.2.2 HashMap常用的变量2.2.3 HashMap构造函数 2.3 JDK1.8之前存在…

【Java中HashMap底层实现原理】

文章目录 一、实现原理二、涉及到的数据结构1.位桶数组2.数组元素Node<K,V>实现了Entry接口3.红黑树 三、HashMap的存取机制1.HashMap如何getValue值:2.HashMap如何put(key&#xff0c;value): 四.HasMap的扩容机制resize():总结 一、实现原理 首先有一个每个元素都是链…

HashMap的实现原理+阿里HasMap面试题

HashMap可以说是面试必问的,是因为我们平时是经常使用的,而掌握他的底层原理,对于我们的工作也会有很大帮助. 在学习HashMap之前我们需要明白两个问题,这两个问题如果搞明白,对于我们下面的学习将会容易很多. 一.hashcode和equals, equals&#xff1a;是否同一个对象实例。注…

Java中HashMap的实现原理

一、Java中的hashCode和equals 1、关于hashCode hashCode的存在主要是用于查找的快捷性&#xff0c;如Hashtable&#xff0c;HashMap等&#xff0c;hashCode是用来在散列存储结构中确定对象的存储地址的如果两个对象相同&#xff0c;就是适用于equals(java.lang.Object) 方法…

HashMap底层实现原理及扩容机制

HashMap的数据结构&#xff1a;数组链表红黑树&#xff1b;Java7中的HashMap只由数组链表构成&#xff1b;Java8引入了红黑树&#xff0c;提高了HashMap的性能&#xff1b;借鉴一张图来说明&#xff0c;原文&#xff1a;https://www.jianshu.com/p/8324a34577a0 下面简单说一下…

HashMap 实现原理

简介 本文为我对 HashMap 实现原理的笔记整理以及一些个人理解&#xff0c;如若发现有错误的地方&#xff0c;欢迎留言指正 在不同的 Java 版本中 HashMap 的实现也略有不同&#xff0c;本文示例使用的 Java 版本为&#xff1a;“1.8.0_181” 什么是 Hash&#xff08;散列函…

HashMap底层实现原理(看这一篇就够了)

HashMap概述 HashMap实现了Map接口&#xff0c;我们常用HashMap进行put和get操作读存键值对数据。下面介绍基于jdk1.8深入了解HashMap底层原理。 HashMap数据结构 HashMap实际是一种“数组链表”数据结构。在put操作中&#xff0c;通过内部定义算法寻止找到数组下标&#xf…

HashMap的实现原理及其特点

1) HashMap可以接受null键值和值&#xff0c;而HashTable则不能&#xff0c;HashMap是非synchronized的&#xff1b;存储的是键值对。 2) HashMap是基于hashing原理,使用put(key,value)存储对象到HashMap中&#xff0c;使用get(key)从HashMap中获取对象&#xff0c;当我们给pu…

说一下HashMap的实现原理?

点击上方蓝色“趣学程序”&#xff0c;选择“设为星标” 回复“资源”获取独家整理的学习资料&#xff01; 回复“加群”与更多小伙伴共同成长&#xff01; 回复“源码”获取专属项目源码&#xff01; 本文会对java集合框架中的对应实现HashMap的实现原理进行讲解&#xff0c;然…

HashMap的实现原理和底层数据结构

看了下JAVA里面有HashMap、Hashtable、HashSet三种hash集合的实现源码&#xff0c;这里总结下&#xff0c;理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和HashMap、Hashtable的区别 HashMap和Hashtable的实现原理 HashMap的简化实现MyHashMap HashMap和Hashtable的…

HashMap底层实现原理

HashMap实现原理 1.概述 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存放&#xff0c;并且允许null键和null值&#xff0c;因为key值唯一&#xff08;不能重复&#xff09;&#xff0c;因此&#xff0c;null键只有一个。另外&#xff0c;hashmap不保证元素…

hashMap实现原理

1. HashMap概述&#xff1a; HashMap是基于哈希表的Map接口的非同步实现&#xff08;Hashtable跟HashMap很像&#xff0c;唯一的区别是Hashtalbe中的方法是线程安全的&#xff0c;也就是同步的&#xff09;。此实现提供所有可选的映射操作&#xff0c;并允许使用null值和null键…

HashMap的实现原理和底层结构

哈希表&#xff08;hash table&#xff09;也叫散列表&#xff0c;是一种非常重要的数据结构&#xff0c;应用场景及其丰富&#xff0c;许多缓存技术&#xff08;比如memcached&#xff09;的核心其实就是在内存中维护一张大的哈希表&#xff0c;而HashMap的实现原理也常常出现…

【java】HashMap底层实现原理

目录 一.哈希表(散列)1.什么是哈希表2.什么是哈希冲突(面试题)3.解决哈希冲突的方法(面试题)(1) 开放地址法① 线性探查②二次探查③随机探查 (2) 再哈希法(3) 链地址法(4)建立公共溢出区 二.HashMap1.HashMap的hash()算法(面试)(1)为什么不是h key.hashCode()直接返回&#x…

HashMap底层实现原理解析

一、HashMap底层实现原理解析 我们常见的有数据结构有三种结构&#xff1a; 数组结构链表结构哈希表结构 下面我们来看看各自的数据结构的特点&#xff1a; 1&#xff09;数组结构&#xff1a; 存储区间连续、内存占用严重、空间复杂度大 优点&#xff1a;随机读取和修改效…

HashMap底层实现原理概述

1. 前言 在一场面试中最能打动面试官的其实是细节&#xff0c;候选人对细节的了解程度决定了留给面试官的印象到底是“基础扎实”还是“基础薄弱”&#xff0c;如果候选人能够举一反三主动阐述自己对一些技术细节的理解和总结&#xff0c;那无疑是面试过程中的一大亮点。HashM…

HashMap实现原理分析

之前转载过一篇HashMap相关分析文章&#xff0c;快速链接&#xff1a;HashMap实现原理分析 既然有前辈已经将源码分析总结了出来&#xff0c;我们在继续学习研究源码实现的时候不妨借鉴借鉴前人的总结与经验~ 本文转自&#xff1a;https://blog.csdn.net/hefenglian/article/…

HashMap面试,看这一篇就够了

历史热门文章&#xff1a; 七种方式教你在SpringBoot初始化时搞点事情 Java序列化的这三个坑千万要小心可以和面试官聊半个小时的volatile原理Java中七个潜在的内存泄露风险&#xff0c;你知道几个&#xff1f;JDK 16新特性一览啥&#xff1f;用了并行流还更慢了InnoDB自增原理…

java中HashMap原理

1、为什么用HashMap&#xff1f; HashMap是一个散列桶&#xff08;数组和链表&#xff09;&#xff0c;它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构&#xff0c;能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized&a…

HashMap的实现原理

1. HashMap概述 HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作&#xff0c;并允许使用null值和null键。此类不保证映射的顺序&#xff0c;特别是它不保证该顺序恒久不变。 在java编程语言中&#xff0c;最基本的结构就是两种&#xff0c;一个…