【hashMap扩容】关于hashMap扩容以后,新下标的理解

news/2025/1/8 0:57:28/文章来源:https://www.cnblogs.com/ffyg/p/18650348

首先我们知道hashMap在存取元素的时候的下标算法是这样子的

根据当前元素(e)的hash值((e.hashCode()) ^ (e.hashCode() >>> 16))去上当前hashMap的容量减一(Cap-1)

put和get都是如此

put

 get

所以在扩容算法中,元素的坐标也应是用这种方式存的,看一下代码

我们会发现,

当,当前元素不存在链表的小尾巴时,他放入扩容以后的新数组(newTab),计算下标的时候,使用的还是很直白的方式,即元素hash值与上新数组的容量减一(newCap - 1);

当,当前元素是存在链表结构的时候,会用元素hash与上老数组的容量(oldCap),根据结果是否为0,来拆分成高位链表(hiHead->hiTail)和低位链表(loHead->loTail),并,分别存入到新数组的高位(newTab[j + oldCap])和低位(newTable[j]);

以前我看的时候只知道是把长链表拆了两段分别放入新数组,没有想过为什么要根据e.hash() & oldCap == 0 来拆分,为什么新数组的下标可以直接写成 newTab[j] 和 newTab[j + oldCap];

这是我想记下来的;

-------------------------------------------

这里举个例子方便理解,比如原来的oldCap是16 (0001 0000(这里只写8位)),现在的newCap是32(0010 0000)

先看e.hash() & oldCap == 0,根据结果是否为0判断,其实就是判断下标为4的位是否为0;

如果为0,那就说明e.hash() & (oldCap - 1) == e.hash() & (newCap - 1)  //  下标位4的位为0时 & 0000 1111  & 0001 1111 相同

因此可以直接把原先老数组的下标j直接带入到新的数组,也就是newTab[j] = loHead;

 

同时,看高位链表的下标,j + oldCap  等于  e.hash() & (oldCap - 1) + oldCap,

等于 e.hash() & 0000 1111 的值 加上 0001 0000,

等于 e.hash() & 0001 1111,

等于 e.hash() & (newCap - 1) // 直白的下标写法

所以newTab[e.hash() & (newCap - 1)] 在这里才可以被表示成newTab[j + oldCap]

 

//想到了就先记下来,怕我以后会忘记

 

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

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

相关文章

【自动化测试基础】Pytest前后置处理

Pytest的前后置(固件、夹具)处理 有一些初始化配置和测试之后的收尾,只需要处理一次,这个时候我们就要用到夹具。 Pytest提供了以下几种setup和teardown方法:setup_function 和 teardown_function: 用于每个测试函数 setup_method 和 teardown_method: 用于每个测试方法(…

进阶大模型开发框架LangChain

本文来自博客园,作者:王竹笙,转载请注明原文链接:https://www.cnblogs.com/edeny/p/18650785

【unity】学习制作类银河恶魔城游戏-6-

碰撞检查 控制面板定义变量射线功能创建射线实体分配射线实体调整射线编辑碰撞代码 创建地面和墙面的层判断是否碰撞到了地面这行代码的作用是:从groundCheck的位置开始,向下(Vector2.down)投射一条射线,距离为groundCheckDistance,只检测whatIsGround指定的层上的物体。…

直播预告丨社区年度交流会 《RTE 和 AI 融合生态洞察报告 2024》发布

新的一年开始,是时候再深度交流一次了!欢迎关注 1 月 4 日周六晚 社区年度交流会的 线上直播 。这将是一群 实时多模态 AI 开发者 的聚会。我们将一起探讨 Voice Agent 在 AI 陪伴助手、AI 硬件和 AI 企业服务等应用场景中的技术突破与产品创新。同时,我们也会交流 RTE 开发…

从 LB Ingress 到 ZTM:集群服务暴露新思路

12 月 28 日, KubeSphere 社区联合 Higress 社区主办的云原生 AI Meetup 广州站成功召开,我们非常荣幸邀请到CNCF Ambassador、Flomesh 社区布道师——张晓辉老师,张老师为大家带来了一场主题为「从 LB Ingress 到 ZTM:集群服务暴露新思路」的主精彩分享。以下为演讲实录,…

CH32V203F6P6-TSSOP20测试之03---三种烧录方式

CH32V203F6P6-TSSOP20支持三种下载方式:USB下载、串口下载(用串口2即8脚PA2为TX2接下载的RX,9脚PA3为RX2接下载的TX)和SW二线下载。CH32V203F6P6-TSSOP20的BOOT1内置接GND,而BOOT0外露,用户可以选择两种启动模式,因而支持USB下载和串口下载。接法可以选择下面两种方法的…

第二章 BIOS -- MBR

本文是对《操作系统真相还原第二章》学习的笔记,欢迎大家一起交流。第二章 BIOS --> MBR 本文是对《操作系统真象还原》第二章学习的笔记,欢迎大家一起交流。 第一棒 BIOS 首先我们要先明白计算机的启动过程,在 x86 模式下,开机的一瞬间,cpu 的 cs:ip 寄存器被强制初始…

Office Tool Plus v10 - Microsoft office安装使用激活一条龙

下载Office Tool Plus Office Tool Plus是一款相当牛逼的office安装工具,并且安装完了顺带激活,也可以很快捷的卸载office清除激活信息等等。 👉👉点击下载 Office Tool Plus移除老的office安装office 点击页面菜单-部署在产品这栏添加需要的产品.进行下载安装,等待即可…

a16z:小模型 + 边缘 AI 将定义 2025;音效模型 TangoFlux:3 秒钟生成 30 秒音频丨RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

mqtt应用问题

1、mqtt程序主动断开后,无法再次收到消息 解决办法:方法一、在emqx服务端中主动踢除客户端方法二、代码里 面将session设置为true,每次断开会清除会话2、正在进行过多的发布(32202)解决办法:方法一、默认支持一次新发送10条消息,最大是1000,可以设置//options.setMaxInfl…

打靶记录24——Presidential

靶机: https://www.vulnhub.com/entry/presidential-1,500/ 下载(镜像):https://download.vulnhub.com/presidential/Presidential.ova 难度:中目标:获得 Root 权限 + 2 Flag攻击方法:主机发现 端口扫描 信息收集 备份文件 子域名爆破 phpmyadmin 密码爆破 本地文件包含…

继续聊一聊sqlsugar的一个机制问题

几个月前换了新工作,从技术负责人的岗位上下来,继续回归码农写代码,在新公司中,我不是技术负责人,没太多的话语权。 公司这边项目统一都是使用了SqlSguar这个orm,我也跟着使用了几个月,期间碰见了不少奇奇怪怪的问题,甚至之前特意写文章“骂”过,但是今天要聊的这个问…