HashMap的扩容看这一篇足够

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

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

HashMap添加数据的详细过程,如下图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623590.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录02——机械臂几何法与DH表示法

系列文章目录 本科毕设正在做多轴机械臂相关的内容,这里是一个学习机械臂运动学课程的相关记录。 如有任何问题,可发邮件至layraliufoxmail.com问询。 1. 数学基础 2. 机械臂几何法与DH表示法 文章目录 系列文章目录一、手臂几何法1.机械手臂2.机械手臂…

三种空间数据的聚合算法

原始数据分布 给老外做的Demo,所以是英文界面。 原始数据分布情况如下: geojson文本内容: 三种方法基本原理 三种聚合算法来做一个例子(500条记录)。 方法1:按Ol默认方法进行聚类,使用Open…

MongoDB分片部署(windows)

OS:win10 MongoDB:4.4.24 分片架构 从图中可以看出,分片集群中主要由三个部分组成,即分片服务器( Shard )、路由服务器 ( Mongos )以及配置服务器( Config Server &am…

vue-treeselect 的基本使用

vue-treeselect 的基本使用 1. 效果展示2. 安装 插件3. 引入组件4. 代码 1. 效果展示 2. 安装 插件 vue-treeselect是一个树形的下拉菜单,至于到底有多少节点那就要看你的数据源有多少层了,挺方便的。下面这个这个不用多说吧,下载依赖 npm in…

文件分发软件有哪些?最值得推荐的文件分发软件

文件分发软件有哪些?最值得推荐的文件分发软件 文件分发软件通常用于在企业或个人之间高效、安全地分发大量文件或软件包。文件分发软件在功能、安全、兼容性上各有差异,以下是一些文件分发软件的列举,以及它们的特点或优势,希望…

【电控笔记2.3】速度回路+系统延迟

2.3.1速度回路pi控制器设计 pi伯德图近似设计(不考虑延时理想情况下) Tl:负载转矩 PI控制器的转折频率:Ki/Kp

如何获取淘宝商品网页上的内嵌视频

如何获取淘宝商品网页上的内嵌视频 1.打开视频所在网页,按下F12(或者打开“开发者工具”) 2.在开发者工具中选择“网络”,并刷新页面。 3.这时你会看到一些资源,找到视频格式的资源,在新标签页中打开 4.好…

C#学习笔记11:winform上位机与西门子PLC网口通信_下篇

今日终于到了winform上位机与西门子PLC网口通信的系列收为阶段了,一直没一口气更新完,手头上也没有可以测试用的PLC设备,虚拟仿真用到的博图软件也不想下载(会让我电脑变卡)。 于是等了些日子购买西门子PLC&#xff0…

扫雷 【搜索,哈希】

9.扫雷 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N1e5100; int n,m,res0; struct pt{int x,y,r; }; typedef pair<int,int> pii; map <pii,int> a;//炸雷的map,键是x,y,值是r map <pii,int&…

探索Python中的生成器:让数据流动起来

文章目录 1. 生成器1.1 基础1.2 工作原理1.3 表达式1.4 高级应用 2. 生成器是不是相当于函数中的return3. 生成器为什么叫yield 在Python面试中&#xff0c;深入了解生成器是关键。这一特性通过延迟计算优化内存使用&#xff0c;广泛应用于数据流处理和异步编程&#xff0c;对提…

常用WEB测试用例

1、登录 ①用户名和密码都符合要求&#xff08;格式上的要求&#xff09; ②用户名和密码都不符合要求&#xff08;格式上的要求&#xff09; ③用户名符合要求&#xff0c;密码不符合要求&#xff08;格式上的要求&#xff09; ④密码符合要求&#xff0c;用户名不符合要求…

Spring开发:动态代理的艺术与实践

1. 背景 动态代理是一种强大的设计模式&#xff0c;它允许开发者在运行时创建代理对象&#xff0c;用于拦截对真实对象的方法调用。这种技术在实现面向切面编程&#xff08;AOP&#xff09;、事务管理、权限控制等功能时特别有用&#xff0c;因为它可以在不修改原有代码结构的前…