HashMap中 put()方法的流程、扩容的思路(源码分析~)

news2024/11/14 18:59:48

文章目录

  • put() 方法的流程
  • 扩容流程
  • 为什么它会按照2的幂次方进行扩容呢?

put() 方法的流程

下面我们通过分析源码来总结一下 put() 方法的流程
在这里插入图片描述

扩容流程

根据上图的分析,就可以总结出 HashMap 的扩容流程:

在插入元素时,会先调用hash方法,得到一个hash值,在插入前先判断一下这个数组的长度是否为空或者是否位0,如果为空或者为0的话,就进行初始化,将数组的长度初始化为16,初始化完之后,就会根据hash值计算出该元素在数组中的存储位置,如果该位置为空的化,就直接创建一个节点,插入进入。如果说该位置不为空的话,就会判断一下链表还是红黑树,如果是链表的话,就进行尾插,插入完成之后,就会再判断如果链表中节点的个数大于8并且数组的长度大于64,链表就会转化成红黑树,上述的插入操作进行完之后,size++,就会判断键值对的数量是否大于 初始化容量*负载因子的乘积,如果大于,此时就会对数组进行扩容,而它的扩容是按照2的幂次方进行扩容的。

为什么它会按照2的幂次方进行扩容呢?

  1. 索引的计算效率要高

如果,当hashmap的容量是2的幂次方时,hash &(length-1) 和 hash % length 所得到的值是一样的。因为,& 运算只涉及到按位与操作,而 % 运算需要执行完整的除法和取余运操作,所以,& 更快,按照这种方式也就提升了索引计算的效率。

  1. 减少冲突

2 的幂次方的容量可以使得存储位置分布更加均匀,因为,在哈希函数中,它是将hashcode的低16异或上了高16位,这种方式就使得哈希码的高位信息也能参与到数组索引计算中,从而提高哈希码的均匀性,而在计算存储位置时,是按照 hash & (length-1),length-1的,length是2次幂,这样所得到的数值的二进制就是全1,比如,初始化容量是16,减1后15,15的二进制就是1111, 此时就可以让哈希码的低位能够完全参与到位运算中,从而实现高效的分布。

  1. 扩容时元素重新分配简单

  1. 扩容时元素重新分配简单

由于新的容量是2 的次幂,所以,在进行完扩容之后,只需要将原数组中的元素重新分配到新数组的相应位置即可,这就大大简化了扩容操作的复杂度

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LMDrive 端到端闭环自动驾驶框架

LMDrive,一种新颖的语言引导的端到端闭环自动驾驶框架。LMDrive独特地处理和整合多模态传感器数据与自然语言指令,使车辆能够在现实的指令设置中与人类和导航软件进行交互。 LMDrive由两个主要部分组成: 1)一个视觉编码器&#x…

(javaweb)java中spring项目的搭建

spring 1.地位高-- 后端web开发--基于springboot开始 二.SpringBoot Web入门 1. http--请求协议 localhost--本机服务 8080--端口号 /hello--访问的资源 发起请求之后要被web应用程序处理 路径访问成功!!!localhost:8080/hel…

桌面云备份可以删除吗?安不安全

桌面云备份可以删除吗?答案是可以的。如果用户不需要这些备份或者想要释放存储空间,桌面云备份是可以进行删除的,并且删除桌面云备份是一个相对安全的过程,但需要注意以下几点来确保操作的安全性和数据的完整性。 一、桌面云备份…

C# Unity 面向对象补全计划 泛型约束

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 1.泛型约束了什么 在C#中,泛型约束用于限制泛型类型参数的类型 可以在泛型类型或方法的声明中使用 where 关键字来指定这些约束 2.约束栗子 基类约束…

ShardingSphere之ShardingProxy实战操作、分布式事务

文章目录 简介基础使用部署ShardingProxy配置分库分表策略 分布式事务机制介绍XA事务Demo使用另外两种XA事务管理器 简介 ShardingSphere的两个核心产品分别为ShardingJDBC和ShardingProxy。前文已经详细介绍了ShardingJDBC的具体使用,接下来介绍服务端的分库分表S…

MyBatis搭建和增删改查

MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离,…

Java01 Java预备知识

第一节:Java预备知识 进制转化 (1):二进制转十进制采用数字与阶码相乘并相加,阶码从右往左依次增大,从左往右依次减小。 例:100(2)0*2^00*2^11*2^44(10) (2)&#xff1a…

【远程桌面】远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

转发原文:https://blog.csdn.net/juanjuan_01/article/details/127005255 错误提示 Windows10系统中远程连接服务器的时候出现如下错误的提示: 解决方案一: 步骤1、winR打开运行窗口 步骤2、输入gpedit.msc命令,点击“确定”&a…

Go语言-- 版本管理go module以及go.sum详解

为了确保一致性构建,Go语言中引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 在进行go语言项目开发的时候,会依赖3种类型的库包&#x…

使用ThreadLocal来存取单线程内的数据

一.什么是ThreadLocal? ThreadLocal,即线程本地变量。如果你创建了一个 ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是在操作自己本地内存里面的变量&…

Selenium+Python自动化测试:解决无法启动IE浏览器及报错问题

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 前言:记录启动IE浏览器的报错及解决方法。 错误1: selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe execu…

MySQL:索引(Index)语句

索引的限制 每个表最多可以有 16 个索引(InnoDB 表的限制)。 单个索引最多可以包含 16 列。 索引列的最大长度为 767 字节(对于 CHAR, VARCHAR, 和 BINARY 类型),3072 字节(对于 BLOB 类型)。…

网鼎杯比赛二次注入技巧

文章目录 前端的网页展示分析题目暴力破解寻找代码找到注入点进行注入查询想要的文件 前端的网页展示 分析题目 1.目前我们能看到的只有三个页面,但是我们可以看到三个*号。 2.考虑三个*的密码是什么,这里可以采用暴力破解(我们先猜这是三个…

【精选】6款一键生成论文的软件3000字论文网站

千笔-AIPassPaPer是一款功能强大且全面的AI论文写作工具,特别适合学术研究者和学生使用。它不仅能够一键生成高质量的论文初稿,还涵盖了700多个学科专业方向,满足各种学术需求。 一、千笔-AIPassPaPer 传送门:https://www.aipape…

Codeforces Round 963 (Div. 2) A-C

A. Question Marks 直接模拟一遍&#xff0c;&#xff1f;跳过&#xff0c;其他统计 #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> using namespace std; int t, n; int w[200005]; int main() …

论文辅导 | 基于概率密度估计与时序Transformer网络的风功率日前区间预测

辅导文章 模型描述 本文所提出的时序优化Transformer 结构&#xff0c;该模型从结构上看由三部分组成&#xff1a;向量映射、编码器和解码器。编码器输入为数值天气预报数据以及相应的时间编码。解码器输入为预测日之前输出功率历史数据以及相应的时间编码。这些数据在经过向量…

【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Lambda表达式 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C异常 &#x1f4d2;1. C异常概念…

MySQL基础:int(1) 和 int(10) 有什么区别

在数据库设计与维护的日常工作中&#xff0c;一个常见但易引发误解的话题围绕着整型字段&#xff08;如INT&#xff09;的显示宽度&#xff08;如int(1)、int(10)&#xff09;的实际作用。这一现象不仅在新手中频繁出现&#xff0c;就连经验丰富的开发者也时常陷入误区。最近&a…

2024年【山东省安全员B证】考试报名及山东省安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员B证考试报名参考答案及山东省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及山东省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助山东省安全员B证证考试学员顺利通过考试。 1、【…

Linux驱动开发—设备树基本概念,语法详解

文章目录 什么是设备树&#xff0c;为什么引入设备树&#xff1f;设备树基本概念相关术语解释设备树源码所在地使用DTC编译设备树基本的DTC编译命令基本的反编译命令效果演示&#xff08;编译与反编译&#xff09; 设备树语法1. 节点 (Node)2. 属性 (Property)3. 包含文件 (Inc…