HashMap的执行原理

简介: HashMap的执行原理

HashMap Java 集合框架中的一个实现类,它基于哈希表数据结构来存储键值对。下面是HashMap的执行原理:

  1. 当向HashMap中插入键值对时,首先会对键进行哈希运算,得到一个哈希值。HashMap会根据这个哈希值确定键值对的存储位置,如果该位置为空,则直接将键值对存储在该位置;如果该位置已经有其他键值对存在,那么会通过链表或红黑树的方式解决冲突,将新的键值对添加到链表或红黑树的末尾

2.    哈希表HashMap内部通过一个哈希表来存储键值对。哈希表是一个数组,每个位置称为一个桶(bucket),每个桶可以存储一个或多个键值对。通过哈希函数可以将键映射到桶的索引上,从而实现快速的插入、查找和删除。

3.     哈希函数哈希函数将键值映射到桶的索引上。当我们调用put(key, value)方法向HashMap中添加键值对时,首先会根据键的哈希值计算出桶的索引,然后将键值对放入相应的桶中。在HashMap中,哈希函数使用键的hashCode()方法计算哈希值,然后再对桶的数量取余数来得到桶的索引。

4.     解决哈希冲突由于不同的键可能有相同的哈希值,这就产生了哈希冲突。当多个键被映射到同一个桶时,HashMap采用链地址法来解决冲突。具体来说,每个桶中都维护一个链表(或红黑树),具有相同哈希值的键值对会以链表节点(或红黑树节点)的形式存储在同一个桶中。当需要查找或删除键值对时,首先根据键的哈希值找到对应的桶,然后再在桶内的链表(或红黑树)中进行线性查找或搜索。

5.     扩容和重新哈希HashMap会自动进行扩容操作以保持负载因子(Load Factor)在可接受的范围内。负载因子是指哈希表中键值对的数量与桶的数量之比。当键值对数量超过负载因子与当前桶数量的乘积时,就会触发扩容操作。扩容时,HashMap会创建一个新的桶数组,并将所有键值对重新计算哈希值并放入新桶中,这个过程称为重新哈希。

6.     迭代顺序HashMap的迭代顺序是不确定的,它不保证键值对的次序与插入的次序一致。如果需要有序的遍历,可以考虑使用LinkedHashMap

总结起来,HashMap通过哈希表和哈希函数实现了高效的键值对的存储和查找,它具有快速的插入、删除和查找操作。但需要注意的是,为了保证哈希表的性能,合理选择哈希函数、负载因子以及适当的容量大小非常重要。

 

相关文章
|
6月前
|
存储 缓存 安全
面试题-HashMap底层原理与HashTable的区别
字节跳动面试题-HashMap底层原理与HashTable的区别
63 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 的幂次方,从而优化了哈希表的性能。
33 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的特点是元素的无序性和不重复性。
68 1
【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)
|
6月前
|
存储 缓存 安全
Java HashMap:哈希表原理、性能与优化
Java HashMap:哈希表原理、性能与优化
273 1