Map (四) HashMap 已故事的角度理解 resize()

【Unity】制作简易三维场景 本文介绍如何制作一个三维场景 阅读详情

我们先来看一篇故事,有益我们有更好的理解。

很久以前有一个学校,有7500名学生(size)和100间教室(oldCap)。学生的学号为0000~7499(hash),教室的编号为0~99 (数组下标)。为了使学生均匀的进入每间教室,校长规定,按学生学号的末尾2位选择对应编号的教室(hash & (数组长度 - 1)),如:

  • 学号 0001 进入 01 教室
  • 学号 0012 进入 12 教室
  • 学号 0212 进入 12 教室
  • 学号 7001 进入 01 教室
  • 学号 7401 进入 01 教室

学校规定:如果学生超过7500名(超过 oldThr),就将教室扩充,扩充 10 倍,即1000间(newCap)。将1000间分为10个区(原来的区对应低位,多出来的9个区对应高位)。

(每个区的每个房间教室摆放一摸一样,只有编号不一样)

  • 0区 0~99
  • 1区 100~199
  • 2区 200~299
  • 以此类推

(因为 HashMap 计算是2进制,所以扩充2倍 , 而我们这里计算为 10 进制,所以扩充10倍。为了更方便理解。)

不巧过几天就来了一名新学生,校长也如约的将教室扩充到了1000间。扩充完毕后就需要重新分配位置了,这次的规定是,按学生学号的末尾3位选择对应编号的教室,如:

  • 学号 0001 进入 001 教室
  • 学号 0012 进入 012 教室
  • 学号 0212 进入 212 教室
  • 学号 7001 进入 001 教室
  • 学号 7401 进入 401 教室

对于教室扩充为1000间,并将匹配的学号尾数由2位变成了3位。可以看到,学号第二位(从左往右数)为0的学生,教室位置根本就没有变化。

所以校长为了加快换教室的速度,指挥到:“学号第二位是0的学生坐在原位不要动((e.hash & oldCap) == 0),不为0的学生((e.hash & oldCap) != 0),根据第二位的数字找到相应的区,同样位置的教室坐下!"。此话一出,学生快速找到了自己对映的区和对映的教室,不一会就各自在自己的位置上坐好了。

上面的故事抽象的描述了一下 HashMap 扩容时候的操作。最主要的就是在校长指挥的时候,判断学号第二位是否为0,为0就在原地不动,不为零加上相应的固定值(上面故事中固定值是自己学号的第二位固定值)。

所以要理解 HashMap 如何扩容,必须深刻的理解 HashMap 是如果通过 HashCode 进行计算得出存储位置的。


下面我们再来看图,看看是如何进行扩容的。

我们要先知道16的二进制是 00000…0010000.和以下几个需要明白的地方

  1. 一个16容量的 HashMap 数组,阀值是12,在存入第13个的时候开始扩容。
  2. 需注意 HashCode 是 32 位的字节码,但是在存储的时候其实一般关注后面的位数
  3. 黑色 bit 位 表示本次计算存储位置时需要用到的 bit 位,
    红色 bit 位 的表示本次计算存储位置时不需要考虑是什么值的 bit 位
  4. 每个链表的元素都分为两种颜色,一种深色,一种浅色。
    4.1. 深色元素代表本次扩容时,容量值(16)的二进制是1的坐标(16的2进制为1的,坐标是第5位)和 hash 相应坐标的值相同 (第5位为1)
    4.2. 浅色则和 hash 相应坐标的值不同(第5位为0)

在这里插入图片描述

可以看到,扩容后,重新计算位置时,同一个链表中,浅色元素全部留在了原来的位置,
深色元素全部都到了 (当前坐标 + 原来的的容量值)的位置。即:

  • 原来在 0 的去 0 + 16 = 16
  • 原来在 3 的去 3 + 16 = 18
  • 原来在 15 的去 15 + 16 = 31

这个就是 HashMap 扩充的特性。在相同链表的扩充后存储位置只有两种选择,要不留在原地,要不加上相应的原容量值。这也是 HashMap 扩容时最重要的环节。也是最耗时的地方(但是对于别的解决办法来说是最快的最高效的)。


最后附上流程图,看不清楚可以右键点击放大观看。
在这里插入图片描述
如果有那些讲的不好或者讲的不仔细的地方,欢迎评论留言。


Map (一) HashMap 构造函数的秘密
Map (二) HashMap put()方法详细解刨
Map (三) HashMap 如何利用 hash 计算存储位置
Map (四) HashMap 已故事的角度理解 resize()
Map (五) HashMap get()

【Arduino 动手做】构建一个迷你 Las Vegas RGB LED 球体 《Arduino迷你拉斯维加斯球体项目:15岁少年的创意挑战》 15岁的Ben通过本项目展示了如何利用Arduino平台制作一个经济实惠的迷你拉斯维加斯球体夜灯。该项目涉及LED选择(采用WS2812B可编程灯带)、电子元件配置(含Arduino Nano微控制器和红外遥控)以及3D建模设计(100毫米直径球体)。项目难点包括LED布局优化、供电方案设计和3D打印外壳制作。Ben详细记录了从背景研究、电路设计到最终实现的完整过程,特别强调了分辨率与成本的平衡,以及如何通过白色扩散器改善视觉效果。这个项目不仅 阅读详情

相关推荐

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

深入理解HashMap

/** *@author annegu *@date 2009-12-02 */ [size=medium]Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论。 1、hashmap的数据结构 要知道hashmap是什么,首先要...

annegu 539

51雾化器实现

1. 雾化器简介 雾化器是将试液雾化的一种器械。雾化器是原子化系统的重要部件,其性能对测定的精密度和化学干扰等产生显著影响。因此要求雾化器喷雾稳定、雾滴细小、均匀和雾化效率高。雾化器的类型有超声雾化器,空气压缩式雾化器,网式雾化器。超声雾化器因其价格合适,适合家用,被广泛应用于加湿器,香薰机等各种小家电,也在医疗领域有很多的应用。家用雾化器的主要器件是一枚雾化片。 家用雾化器分为两种不同类别雾化片,实孔雾化片和微孔雾化片,这两种的喷雾方法和工作原理是有所不同的。不同的雾化片需要特定的频率才能工作。 实孔雾

qq_42415953的博客 2万+

vue,初始化地图的canvas宽高不正确。调整一下浏览器的宽度就恢复正常

这是由于地图创建先于dom创建完成的事件,因此需要map.resize才行。 目前是定时去map.resize().体验较差。。。 setTimeout(() => { if(this.map){ console.log('resize') this.map.resize() this.mapWidth=this.map.getCanvas().width+"p...

A873054267的博客 1200

模糊控制——基本原理(附MATLAB程序)

模糊化:使用隶属函数将实际输入转换为模糊集合的隶属度值。规则库:利用“如果-那么”规则将模糊输入映射到模糊输出。推理机制:通过规则的模糊化和模糊集合的合成,生成模糊输出。去模糊化:将模糊输出转换为具体的控制信号,常用的方法包括质心法和最大隶属度法。这些步骤综合起来,实现了模糊控制系统对复杂和不确定系统的有效控制。模糊控制系统通过结合模糊逻辑和规则库来处理复杂系统中的不确定性和模糊性。它的核心在于模糊集合和隶属函数,通过推理机处理模糊规则,并最终通过去模糊化生成具体的控制信号。

qq_35623594的博客 5559

CH340驱动安装全攻略:从Windows到MacOS的避坑指南(2025最新版)

本文提供2025年最新版CH340驱动安装全攻略,涵盖Windows、MacOS和Linux三大操作系统。详细解析了驱动安装的核心原理、标准流程,并针对Windows设备管理器报错、MacOS系统安全限制等常见“坑点”提供了深度排错与解决方案,旨在帮助开发者快速稳定地完成USB转串口通信配置。

earth的博客 426

HashMap之resize

1. 导读 上期分享了HashMap的key定位以及数据节点的设计, 本期就下面三个问题来分享下个人对于HashMap扩容的理解: .1 HashMap为什么要扩容? 何时扩容? .2 负载因子为什么是0.75? .3 HashMap如何扩容; 2. HashMap为什么要扩容 经过上期分享, 我们都知道HashMap在构建初始是可以指定table(hash槽)的长度的, 假设我们设定了2, 这...

yongqi_wang的博客 1510

全桥LLC谐振变换器设计与双环控制策略详解

LLC谐振变换器作为高频开关电源的核心拓扑,通过谐振腔实现软开关特性,显著提升转换效率(可达96%以上)。其工作原理基于谐振电感、电容的协同作用,当开关频率接近谐振点时实现ZVS/ZCS。在工业电源、电动汽车充电等场景中,电压电流双环控制策略通过引入电流内环和竞争仲裁机制,有效改善动态响应(实测负载跳变时电压跌落减少60%)。数字控制实现时需注意ADC采样同步和PWM更新时序,而谐振参数测量与温升管理则是工程实践的关键。

weixin_29189987的博客 256

【Java集合】HashMap的resize()源码详解以及JDK1.7与JDK1.8的区别

HashMap的扩容源码详解,以及JDK1.7和JDK1.8的resize()方法的源码比较。

小七的博客 2755

深入浅出之CSPBlock模块(YOLO)

YOLO CSPX模块是YOLO系列算法中的一个重要组成部分,它通过跨阶段部分连接的方式减少了计算量,同时保证了模型的准确率。在YOLOv4及后续版本中,CSPX模块被广泛应用于主干网络和Neck结构中,为模型提供了强大的特征提取和融合能力。

浩瀚之水的专栏 6753

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

【有料】HashMap之resize详解

经过上期分享, 我们都知道HashMap在构建初始是可以指定table(hash槽)的长度的, 假设我们设定了2, 这时候有10万数据要插入, 最好的情况就是两边各是5万, 最差的情况就是一边是10万, 显然这个时候hash冲突已经很严重了, 为了解决冲突, 我们就需要对table进行扩容, 所以HashMap的扩容就是加长table的长度, 来减少hash冲突的概率;根据统计学的结果, hash冲突是符合泊松分布的, 而冲突概率最小的是在7-8之间, 都小于百万分之一了;这就悲剧了, 在循环里出不去了;

daobuxinzi的博客 766

CLAHE 算法学习 matlab

概念可参考: CLAHE (Contrast Limited Adaptive Histogram Equalization)算法学习CLAHE具体实现主要包括6个步骤。1):分块。将输入图像划分为大小相等的不重叠子块,每个子块含有的像素数为M。参考示例为8×8块。 2):计算子块直方图。 3):计算剪切阈值clipLimit 4):像素点重分配。对每个子块,使用步骤三中多余的像素重新分配。 5):直方图均衡。 6):像素点灰度值重构。(源码中采用了双线性插值) http://www.realtimer

baidu_34971492的博客 4253

Java面试深度解析:HashMap、JVM与Spring核心机制

Java作为企业级开发的主流语言,其核心技术栈的深度理解是开发者进阶的关键。HashMap作为基础数据结构,采用数组+链表+红黑树的混合实现,通过树化阈值优化查询效率,但需注意其线程不安全特性可能导致的死循环与数据丢失问题。JVM内存模型则涉及堆、栈等核心区域的划分,理解GC调优参数如-Xms/-Xmx对性能优化至关重要。Spring框架通过IOC容器管理Bean生命周期,依赖注入与AOP机制是其核心设计思想。掌握这些原理不仅能应对技术面试,更能为高并发场景下的系统设计提供理论基础。

weixin_30709061的博客 321

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大厂Java面试深度解析:核心、并发与Spring Boot实战

Java作为企业级开发的主流语言,其核心机制与并发编程是开发者必须掌握的基础。JVM内存模型揭示了对象生命周期管理原理,而synchronized与ReentrantLock等并发工具则保障了多线程环境下的数据安全。Spring Boot通过自动配置机制显著提升了开发效率,其背后的条件装配与组件扫描技术值得深入理解。在电商、金融等高并发场景中,合理运用缓存策略与连接池监控能有效预防雪崩与泄漏问题。本文通过真实面试案例,详解HashMap并发陷阱、动态数据源配置等高频考点,为3-5年经验的Java开发者提供实

chutisun0039的博客 310

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

2023Java面试八股文高频题解析:从集合到JVM、Spring,揭秘面试官考察本质

在Java技术栈的面试考察中,集合框架与并发机制始终是绕不开的核心环节。HashMap作为最常用的数据结构,其哈希碰撞处理、扩容逻辑与红黑树转换原理,不仅检验候选人的源码阅读深度,更直接影响实际系统的查询性能;而JVM内存区域划分与垃圾回收算法,则决定了高并发场景下的稳定性和调优空间。理解这些基础原理,能够帮助开发者从“背答案”转向“讲思路”,真正应对面试官的层层追问。本文结合2023年高频Java面试题,系统梳理了从基础语法、集合框架到Spring框架、MySQL索引及Redis缓存等核心知识点,并深入分

weixin_33826609的博客 359

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java面试八股文核心考点整理:集合、JVM、并发、Spring、MySQL与Redis

Java后端开发中,基础知识体系是技术深度与工程实践能力的根基。集合框架的底层设计(如HashMap扩容机制)与JVM内存管理、垃圾回收策略,决定了程序性能的上限;并发编程中synchronized与ReentrantLock的博弈、线程池参数调优,则是高并发场景下系统稳定性的关键。Spring框架的IOC/AOP思想与Spring Boot自动装配原理,构成了企业级开发的主干;MySQL索引失效与事务隔离级别、MVCC机制,以及Redis持久化与缓存穿透等问题,更是面试与实战的高频关注点。本文系统梳理Ja

weixin_34320159的博客 403

2026 Java面试不是背八股:从原理到场景构建核心知识体系

Java面试正在发生本质变化,从单纯的八股文记忆转向对知识体系与场景落地能力的综合考察。面试官不再满足于“HashMap底层是数组加链表加红黑树”这样的结论,而是连环追问扩容机制、并发问题等原理细节,甚至直接抛出秒杀防超卖、分布式锁等真实业务场景。理解线程池核心参数如何配合、事务传播行为在什么条件下失效,比死记硬背答案更能体现工程能力。掌握JVM内存模型、并发工具与Spring生命周期等基础概念,是深入解析原理的起点;而技术价值最终要落到分布式系统、缓存一致性等实际应用中去。面对2026年的面试趋势,将每个

weixin_30325971的博客 338

Java面试八股如何高效准备?从面向对象到JVM的完整知识链路

Java技术面试不仅考察语法记忆,更看重对底层原理与工程实践的深层理解。从面向对象三大特性、集合框架的HashMap源码,到JVM内存模型与垃圾回收机制,再到并发编程中的锁升级和线程池参数,每一环都是面试官深挖的切入点。掌握这些核心概念背后的设计逻辑,学会从“是什么”推导“为什么”,才能真正应对连环追问。在实际项目中,无论是选择抽象类还是接口、优化Map扩容,还是排查OOM异常,都依赖对这些基础的融会贯通。本文串联Java基础高频考点,帮助你构建可迁移的知识体系,在面试和工作中游刃有余。

weixin_28712661的博客 280

面试题kkk

这篇文章摘要主要涵盖了Android开发中的核心知识点和技术难点,包括数据结构、Java与Kotlin语言特性、多线程与并发、内存管理、安卓组件与UI、IPC通信、数据库、多媒体处理、设计模式、性能优化、跨端开发等多个方面。文章详细解析了常见数据结构的使用与实现、JVM机制、内存泄漏分析与解决方案、Activity生命周期、事件分发机制、Handler原理、音视频处理、设计模式应用等核心内容,并提供了实际项目中的技术卡点与解决方案。此外,还涉及了性能优化策略、跨端开发差异、技术方案设计思路以及Git常用命令

mix39的博客 930

2026 Java面试突击方案:八股+场景题+AI大模型

在Java后端开发中,并发编程、Spring容器与分布式系统始终是核心能力。理解线程池参数调优、synchronized锁升级、Spring三级缓存解决循环依赖的原理,以及Redis分布式锁的选型,不仅是应对技术面试的基础,也是构建高可用服务的工程实践。随着AI技术落地,RAG检索增强生成、Spring AI集成和Prompt工程逐渐成为后端开发的新场景需求。面对2026年求职季,面试更强调从基础原理到场景设计的综合能力,需要系统化梳理高频考点与答题方法论。本文提供一条从基础八股到场景题,再到AI大模型的短

weixin_33755557的博客 296

练功秘籍---A

常用整理

CarryBest的博客 1650

2026年AI时代程序员面试:50个必考知识点全解析,掌握这些才能拿到Offer

本文系统梳理2026年程序员面试50个必考知识点,覆盖算法数据结构、系统设计、数据库、并发编程、网络、操作系统及AI时代新增考察点。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 259

2026面试题汇总(已完结)

手撕字节跳动面试时出现过的算法题 1.买股票的最佳时机 leetcode 原题链接:买股票的最佳时机 题目: 121. 买卖股票的最佳时机 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 代码: class Solution { public: int maxProfit(vector<int>& prices) { int minDat

qq_23923713的博客 1245

Java HashMap中在resize()时候的rehash,即再哈希法的理解

HashMap的扩容机制---resize() 扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果想装更多的水,就得换大水桶。 我们分析下resi

请叫我大师兄 3万+

java集合map

本文会对java集合框架中的对应实现HashMap和ConcurrentHashMap的实现原理及工作原理进行总结,用于整理和学习。

Brooks Lv 820
上一篇: Map (三) HashMap 如何利用 hash 计算存储位置
下一篇: Map (五) HashMap get()
Carey丶zsh
博客等级 码龄10年 15粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值