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

爬取信用中国里面的行政处罚 result字段名为行政处罚文书号、处罚决定日期、处罚内容、处罚金额、违法事实、处罚机关、公司名称,行政处罚次数。file_path=r'E:\Data analyze\python\行政处罚爬虫/'#路径需要按实际修改。writer = pd.ExcelWriter('统计.xlsx')# 写入Excel文件。src_workbook=file_path+r'行政处罚(名单).xls' #表格名称也要更改。# keyword = input("输入爬取的公司全称必须是全称") 阅读详情

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

很久以前有一个学校,有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()

从零构建腾讯滑块验证码破解引擎:逆向工程与实战对抗 本文深入解析腾讯滑块验证码(原天御验证码)的防护机制,包括环境感知层、行为分析层和验证决策层的核心技术。通过JSVMP虚拟机保护、轨迹验证算法和动态加密体系,腾讯验证码实现了高效的人机识别。文章还提供了安全研究实践指南,涵盖环境模拟和验证码识别方案,并探讨了防御对抗的演进趋势与合规研究建议。 阅读详情

相关推荐

kali设置安装burpsuite中文版

工具:通过网盘分享的文件:Burpsuite 链接:提取码: jay1。

m0_74786138的博客 5202

深入理解HashMap

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

annegu 539

用示波器抓取同步Buck自举电容波形:从充电回路到SW节点振铃的完整分析

本文通过实测TI TPS54561和MPS MPQ4572同步Buck芯片,详细解析了自举电容在充电、维持和放电三个工作阶段的波形特征。重点揭示了电感泄放回路与充电回路重叠时,在SW节点引发的振铃现象及其产生机理,并提供了串联阻尼电阻等有效的工程抑制方法。文章结合示波器实测,为硬件工程师提供了从波形观测到问题调试的完整实践指南。

weixin_29276847的博客 372

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

MIUI升级后录音神秘消失?别慌!手把手教你从Android/data目录找回宝贵录音文件

本文详细解析了MIUI升级后录音文件消失的原因,并提供了从Android/data目录找回录音文件的实用指南。通过技术分析和步骤演示,帮助小米手机用户解决录音文件丢失问题,同时分享预防措施和高级恢复方案,确保重要录音数据安全。

weixin_30696427的博客 281

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘

本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。

2403_85993278的博客 1512

HashMap之resize

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

yongqi_wang的博客 1510

国产操作系统应用迁移与适配

了解国产操作系统的背景及意义

2301_77609559的博客 2678

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

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

小七的博客 2755

【Claude】Disabled organization 错误:组织被禁用的原因与 API Key 绕过方法

如果环境变量存在,下一步是找出它在哪里被设置的。"Disabled organization" 错误的本质不是账户被封,而是认证优先级冲突。环境变量优先级最高始终覆盖 OAuth 订阅认证报错信息具有误导性:"组织被禁用"指的通常是 API Key 所属的组织,而不是你的个人账户旧 Key 是隐形炸弹:即使你已经不再使用某个组织的 API,只要环境变量中残留该 Key,它就会持续覆盖你的订阅认证非交互模式更敏感claude -p模式下,只要有环境变量,就会强制使用它,完全忽略/login。

博客 8865

第3.1.3章 机器人第三方库实战总结:ROS 2 入门实战及和ROS1的对比,打通机器人开发的任督二脉

本文针对机器人SLAM开发中第三方库的学习痛点,重点介绍ROS 2在SLAM中的应用。文章首先对比ROS 1与ROS 2的核心差异,梳理ROS 2知识图谱,包括节点、话题、服务等核心概念。通过实战项目演示如何构建激光SLAM节点,结合代码详解运行流程。最后给出学习建议,强调动手实践的重要性,帮助开发者快速掌握ROS 2在SLAM开发中的关键应用。

行知SLAM 179

【有料】HashMap之resize详解

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

daobuxinzi的博客 766

PreScan快速入门到精通第二十一讲驾驶员模型之驾驶员在环

请注意,操纵杆的输出角度是以度为单位的,而方向盘执行器希望其输入是以弧度为单位的。当选择一个支持的方向盘时,PreScan会自动将按钮映射到正确的功能上(如换挡),并设置轴的正确范围(如转向角度)。该系统中的所有其他组件都是为了提供正确的按钮映射,并为所选的方向盘设置正确的范围。对于每一个额外连接的控制器,它们的ID会增加一个,例如第二个控制器的设备ID为1,第三个控制器的设备ID为2,等等。由于所有的方向盘最初放在编译表上的设备ID都是0,所以用户应该先进行正确的调整,将每个控制器设置为正确的设备ID。.

小明师兄的博客 1423

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

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

weixin_30709061的博客 321

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

chutisun0039的博客 310

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

weixin_33826609的博客 359

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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、付费专栏及课程。

余额充值