HashMap 在 get 和 put 时经过哪些步骤

简介: HashMap 在 get 和 put 时经过哪些步骤

在使用 HashMap 的 get 和 put 方法时,经过以下步骤:

  1. put 方法: a. 首先,根据传入的键(key)计算其 hash 值; b. 使用 hash 值通过哈希函数找到要插入或替换的数组位置,即索引(index); c. 如果该位置上没有元素,直接将键值对存储到该位置; d. 如果该位置上已经存在元素,则根据键的 equals 方法判断是否相等,如果键相等则替换该键对应的值,如果键不相等则发生冲突,需要解决冲突; e. 解决冲突的方法是使用链表或红黑树等数据结构在该位置上存储多个键值对,根据键的 equals 方法找到对应的键值对进行替换; f. 如果链表的长度达到一定的阈值(8),则将链表转换为红黑树,以提高查找效率; g. 如果哈希表的容量不足,即达到了负载因子(load factor)的上限(默认是 0.75),则触发扩容操作,将原有的键值对重新分配到新的哈希表中。
  2. get 方法: a. 首先,根据传入的键(key)计算其 hash 值; b. 使用 hash 值通过哈希函数找到对应的数组位置,即索引(index); c. 如果该位置上没有元素,则返回空值(null); d. 如果该位置上有元素,则根据键的 equals 方法在链表或红黑树上查找对应的键值对; e. 如果找到对应的键值对,则返回该键对应的值,否则返回空值(null)。

以上是 HashMap 在 get 和 put 时的基本步骤,其内部实现还涉及到其他细节,例如使用位运算来计算 hash 值、使用链表和红黑树来解决冲突等。

目录
相关文章
|
2月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
65 5
|
2月前
|
存储 索引
让星星⭐月亮告诉你,HashMap在put数据时是如何找到要存放的位置的?
HashMap 是一种常用的键值对存储结构,其底层采用数组+链表+红黑树实现。本文探讨了 HashMap 在插入键值对时如何确定存放位置。通过分析 `put` 方法的源代码,重点解析了哈希码的计算过程和数组索引的确定方法。哈希码通过 `hashCode()` 方法和位运算优化,确保均匀分布,从而减少哈希碰撞,提高性能。最终,通过 `(n-1) & hash` 计算出数组索引,确保键值对被正确存放到指定位置。
41 2
|
3月前
|
设计模式 安全 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次方+死循环+数据覆盖问题
|
2月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
32 0
|
7月前
|
存储 Java 索引
【JAVA】HashMap的put()方法执行流程
【JAVA】HashMap的put()方法执行流程
HashMap中put()方法源码详解
HashMap中put()方法源码详解
|
存储 安全 索引
HashMap的put方法的具体流程
HashMap的put()方法用于向HashMap中添加键值对。
220 0
|
7月前
|
索引
HashMap的put方法的具体流程
HashMap的put方法的具体流程
HashMap进行put操作时遇到的并发问题
HashMap进行put操作时遇到的并发问题
82 0
|
存储 算法 Java
认真研究HashMap的读取和存放操作步骤
认真研究HashMap的读取和存放操作步骤
68 0