HashMap的扩容看这一篇足够

简介: HashMap的扩容看这一篇足够

在Java中,对于HashMap这样的实现,put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程:

  1. 计算Hash值
  • 首先,put方法会接收一个键(Key)和一个值(Value)作为参数。
  • 调用键对象的hashCode()方法得到一个哈希码(hash code)。
  • 这个哈希码通常会通过某种散列函数进一步处理,以便均匀分布到HashMap内部的数组中。在HashMap中,会使用(n - 1) & hash这样的运算来确定数组的索引位置,其中n是数组的长度。
  1. 解决哈希冲突
  • 如果目标数组索引位置上已经存在元素(即发生了哈希冲突),则会检查是否存在链表(或树形结构,在Java 8中引入了红黑树来优化链表过长的情况)。
  • 如果是链表结构,则遍历链表,通过equals()方法来查找是否有相同的键。如果有,则更新该位置上的键对应的值。
  • 如果遍历结束后都没有找到相同的键,则会在链表末尾(或树形结构的相应位置)新增一个包含新键值对的节点。
  1. 扩容(Resize)
  • 在插入新元素之前或之后(取决于具体实现),HashMap可能需要检查是否需要扩容。当Map中的元素数量超过一定的阈值(通常是容量的一定比例,默认负载因子为0.75)时,HashMap会创建一个新的更大的数组,并将所有旧的键值对重新哈希到新的数组中,这一过程称为“扩容”或“rehash”。
  1. 插入新元素
  • 如果目标位置上没有冲突或冲突已解决,则直接在该位置上插入新的键值对节点。
  1. 调整大小
  • 插入新元素后,如果触发了扩容操作,还会相应调整HashMap的容量和阈值,以适应更多的键值对。
    Java的Map put方法涉及到了哈希计算、冲突解决、可能的扩容操作,最终确保键值对被正确地插入到Map中。整个过程设计的目标是为了尽可能快速地进行查找、插入和删除操作,并保持较好的空间效率。

HashMap添加数据的详细过程,如下图:

相关文章
|
2月前
|
存储 Java
HashMap扩容机制详解
HashMap扩容机制详解
|
8月前
|
存储 容器
HashMap什么时候扩容,如何扩容?怎么轻松化解?
一位2年工作经验的小伙伴面试时被问到,说,HashMap什么时候扩容,为什么要扩容?这个问题本身不是很难,但是这位小伙伴对底层实现原理没有太多关注,所以,被这个问题难住了。 下面我给大家分析一下这个问题的底层逻辑。
87 2
|
2天前
HashMap默认大小和扩容后的大小
HashMap默认大小和扩容后的大小
|
2天前
HashMap和ArrayList初始大小和扩容后的大小
HashMap和ArrayList初始大小和扩容后的大小
|
4月前
|
Java 大数据
ArrayList扩容机制
ArrayList扩容机制
HashMap的扩容机制
HashMap的扩容机制
|
5月前
|
机器学习/深度学习 索引
认真研究HashMap的初始化和扩容机制
认真研究HashMap的初始化和扩容机制
171 0
|
7月前
|
存储 Java 索引
ArrayList 的扩容机制
ArrayList 的扩容机制
|
7月前
ArrayList扩容机制~
ArrayList扩容机制~