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

文章目录

  • 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.rhkb.cn/news/392378.html

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

相关文章

C# 设计模式之原型模式

总目录 前言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中…

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题:为什么不能用#来闭合单引号呢? 在进行URL地址栏传参的时候,是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。(先转ascii码,然后再转十六进制,之后加上%就是…

软甲测试定义和分类

软件测试定义 使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验他是否满足规定的需求或弄清预期结果与实际结果之间的差别 软件测试目的 为了发现程序存在的代码或业务逻辑错误 – 第一优先级发现错误为了检验产品是否符合用户需求 – 跟用户要求实…

函数实例讲解(四)

文章目录 提取不重复值(INDEX、MATCH、COUNTIF)1、INDEX2、MATCH3、COUNTIF 提取不重复的值的经典套路(LARGE、SMALL、ROW)1、ROW2、LARGE3、SMALL) 制作Excel动态查询表四舍五入函数(ROUND、ROUNDUP、ROUNDDOWN&#…

20240806 每日AI必读资讯

英伟达最强AI芯片曝重大设计缺陷,中国特供版意外曝光! - 由于Blackwell GPU的设计缺陷,英伟达发货时间不得不推迟3个月 - GB200包含了2个Blackwell GPU和1个Grace CPU。问题出在连接2个Blackwell GPU的关键电路 - 意味着对于Meta、谷歌、微…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词:对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习(ML)是医学领域快速发展的一个分支,它利用计算机科学和统计学的方法来解决医学问题。众所周知,攻击者可能通过故意为机器学习分类器创建输入来…

VoNR网络架构与网元 IMS终端号码结构(VoLTE和VoNR适用)

目录 1. VoNR网络架构与网元 1.1 VoNR架构 vs VoLTE架构 1.2 回顾语音网络的演进与“分离” 1.3 TS23.228给出的5G的VoNR国际漫游 Home Routed 方案架构图 1.4 VoNR 网络架构图(2022版) 1.5 IMS 网元分类(VoNR VoLTE 适用&#xff09…

LlamaIndex 实现 React Agent

React Agent 是指 LLM 对问题自行推理并调用外部工具解决问题,如下图所示,通过一些推理步骤最终找到想要的答案。 LlamaIndex 提供了实现 React Agent 的框架,通过框架可以轻松的实现上图中的步骤。那么,如果不用 LlamaIndex 应该…

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

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

汇昌联信数字做拼多多运营怎么入行?

拼多多作为中国领先的电商平台之一,近年来在数字运营领域展现出了强大的生命力和创新能力。汇昌联信数字作为一个潜在的新入行者,如何进入拼多多的运营领域,成为业界关注的焦点。本文旨在探讨汇昌联信数字如何通过有效的策略和方法&#xff0…

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘. 已解决

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…

3GPP入门

官网地址 3GPP – The Mobile Broadband Standard 协议下载链接 Directory Listing /ftp/specs/archive 总纲 重点series Signalling protocols ("stage 3") - user equipment to network24 series信令Radio aspects25 series3G 基础LTE (Evolved UTRA), LTE-Adva…

锂电池生产工艺数字化的业务架构.pptx

搜索《方案驿站》公众号进行下载。

【AI落地应用实战】Amazon Bedrock + Amazon DynamoDB 数据设计与建模

一、Amazon DynamoDB简介 在当今数字化转型的浪潮中,企业对数据处理能力的需求日益增长,为了应对大规模数据和高并发访问的挑战,选择一款合适的数据库解决方案变得尤为重要。 Amazon DynamoDB,作为亚马逊云科技提供的一种完全托…

3.表的操作

目录 创建表 创建表案例: 查看表结构 修改表 1.增加新列 2.修改列的属性 3.删除列 4.修改表名 5.修改列 删除表 创建表 语法: CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释…

k8s(六)---pod

六、pod(k8s中最小的调度单元) pod中可以有一个或多个容器 1、官网 2、简介 Pod是k8s中最小的调度单元、Pod具有命名空间隔离性 3、如何创建一个Pod资源(主要两种方式) 1)kubctl run ①kubectl run nginx–imagereg…

【vulnhub】DC-2靶机

信息收集 靶机扫描 nmap 192.168.93.1/24 端口扫描 网页访问 发现访问不到,根据显示考虑IP未遵循重定向到域名 在本机的C:\Windows\System32\drivers\etc 修改hosts⽂件,添加192.168.93.136 dc-2 再次进行访问,可以访问到 点击flag&#x…

测试GPT4o分析巴黎奥运会奖牌数据

使用GPT4o快速调用python代码,生成数据图表 测试GPT4o分析巴黎奥运会奖牌数据 测试GPT4o分析巴黎奥运会奖牌数据 1.首先我们让他给我们生成下当前奥运奖牌数 2.然后我们直接让GPT帮我们运行python代码,并生成奥运会奖牌图表 3.我们还可以让他帮我们…

数组——对数组进行更加全面的理解

1.数组的概念 数组是一组相同类型元素的集合。数组可分为一维数组和多维数组,多维数组常见的是二维数组。 2.一维数组的创建和初始化 2.1 数组的创建 一维数组的创建的基本语法是: type arr_name[常量值] 例如,我们现在想要存储某个班级…

一拖三无线充底座-带给你极致的便利生活

随着科技的不断进步,无线充电技术已经逐渐渗透到我们日常生活的方方面面,一拖三无线充底座作为其中的佼佼者,以其高效、便捷的特点受到广大用户的青睐。本文将从电磁感应原理、多线圈设计、频率匹配、电能传输、功率分配以及充电管理六个方面…