HashMap 的工作原理

简介: HashMap 的工作原理

HashMap 的底层是通过数组 + 单向链表来实现的,在数组中的每一个元素都是链表结构,链表中的每一个节点又是一个 Entry 对象,这个 Entry 对象是用来存储真正的 Key-Value 键值对。在 HashMap 中有两个比较重要的方法,一个是 put()方法、一个是 get()方法。

先说一下 put()方法:

(1)在存储 key-value 键值对的时候,首先会调用 hash()方法计算出 Key 的 hash 的值,从而得到一个十进制的数字,用这个数字和数组长度减一去取模,可以得到一个结果为数组的下标,

(2)接着我们根据这个下标去找到数组中存储的单向链表,然后把链表中的每一个 key 和要插入的 key 进行一个 equals 的比较,如果相等就直接更新这个 value 值,如果不相等,就把新的 key—value 值添加到链表中,

(3)在添加的过程中,如果链表长度超过了默认值 8 的时候,且 hashap 总元素个数大于 64 的时候,则使用红黑树来代替链表从而提高查询速度,否则当哈希表中存储的键值对超过了数组长度乘以负载因子 0.75 的时候,就会将这个数组扩容为原来的两倍。(红黑树在少于 6 个元素的时候会转变为链表)

其次说一下 get()方法:

(1)在调用 get()方法的时候,get()方法和 put()方法比较类似,同样也会先去调用 hash()方法对 key 进行计算,然后用结果和数组长度减一去取模,然后得到 key 的下标。

(2)接着我们根据这个下标去找到数组中存储的单向链表,然后把链表中的每一个 key 和要查找的 key 进行一个 equals 的比较,如果 key 相同的话就取出返回给用户。

最后再总结一下,HashMap 最核心的原理是利用 Hash 值来计算出下标的位置,然后再用 equals()方法比较,equals()方法比较主要是解决 Hash 冲突的问题,

 

相关文章
|
6月前
|
存储 缓存 安全
面试题-HashMap底层原理与HashTable的区别
字节跳动面试题-HashMap底层原理与HashTable的区别
61 0
|
6月前
|
存储 算法 Java
【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地理解HashMap的工作原理,掌握其核心实现。
61 0
【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
|
存储 算法 安全
HashMap底层实现原理
HashMap底层实现原理
165 0
|
1月前
|
机器学习/深度学习 算法
让星星⭐月亮告诉你,HashMap之tableSizeFor(int cap)方法原理详解(分2的n次幂和非2的n次幂两种情况讨论)
`HashMap` 的 `tableSizeFor(int cap)` 方法用于计算一个大于或等于给定容量 `cap` 的最小的 2 的幂次方值。该方法通过一系列的无符号右移和按位或运算,逐步将二进制数的高位全部置为 1,最后加 1 得到所需的 2 的幂次方值。具体步骤包括: 1. 将 `cap` 减 1,确保已经是 2 的幂次方的值直接返回。 2. 通过多次无符号右移和按位或运算,将最高位 1 后面的所有位都置为 1。 3. 最终加 1,确保返回值为 2 的幂次方。 该方法保证了 `HashMap` 的数组容量始终是 2 的幂次方,从而优化了哈希表的性能。
32 1
|
2月前
|
设计模式 安全 Java
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
假如有T1、T2两个线程同时对某链表扩容,他们都标记头结点和第二个结点,此时T2阻塞,T1执行完扩容后链表结点顺序反过来,此时T2恢复运行再进行翻转就会产生环形链表,即B.next=A;采用2的指数进行扩容,是为了利用位运算,提高扩容运算的效率。JDK8中,HashMap采用尾插法,扩容时链表节点位置不会翻转,解决了扩容死循环问题,但是性能差了一点,因为要遍历链表再查到尾部。例如15(即2^4-1)的二进制为1111,31的二进制为11111,63的二进制为111111,127的二进制为1111111。
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
|
6月前
|
Java
HashMap原理解析
HashMap原理解析
161 47
|
存储 安全 Java
java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别
java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别
|
6月前
|
存储 安全 Java
【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)
HashMap是基于Map接口构建的数据结构,它以键值对的形式存储元素,允许键和值都为null。由于键的唯一性,HashMap中只能有一个键为null。HashMap的特点是元素的无序性和不重复性。
67 1
【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)
|
6月前
|
存储 缓存 安全
Java HashMap:哈希表原理、性能与优化
Java HashMap:哈希表原理、性能与优化
269 1