HashMap的扩容机制------resize()

HashMap扩容机制深度解析:从resize()源码到性能调优实战 哈希表作为基础数据结构,其核心在于通过哈希函数将键映射到桶数组实现O(1)查询。当元素数量超过阈值时,哈希表需进行扩容以维持性能,而扩容过程涉及数组重建与元素迁移,是影响性能的关键环节。深入理解扩容触发条件、容量计算逻辑及迁移策略,对高并发场景下的性能调优具有重要价值。在Java集合框架中,HashMap的resize()方法通过高低位链表拆分、红黑树退化等机制优化迁移效率,但不当使用仍可能导致接口超时等线上问题。掌握预设容量、负载因子调优等工程实践,能有效避免频繁扩容带来的性能抖动。 阅读详情

一:首先要知道HashMap什么时候扩容
当元素向HashMap容器中添加元素的时候,会判断当前元素的个数,如果当前元素的个数大于等于阈值时,即当前数组table的长度*加载因子就要进行自动扩容。

由于HashMap的底层数据结构是“链表散列”,即数组和链表的组合,而数组是无法自动扩容的,所以只能是换一个更大的数组去装填以前的元素和将要添加的新元素

分析resize()方法的源代码可以发现:在jdk1.7以前,resize()方法传入的参数是新数组的容量,HashMap也不是无限能扩容的,1:方法中会首先判断扩容前的旧数组容量是否已经达到最大即2^30了,如果达到了就修改阈值为int的最大取值,这样以后就不会扩容了。
2:初始化一个新Entry数组;
3:计算rehash,判断扩容的时候是否需要重新计算hash值,将此值作为参数传入到transfer方法中;这个是和jdk1.8不同的一点,待会看1.8
4:通过transfer方法将旧数组中的元素复制到新数组,在这个方法中进行了包括释放就的Entry中的对象引用,该过程中如果需要重新计算hash值就重新计算,然后根据indexfor()方法计算索引值。而索引值的计算方法为{ return h & (length-1) ;}即hashcode计算出的hash值和数组长度进行与运算。。。。。jdk1.7中重新插入到新数组的元素,如果原来一条链上的元素又被分配到同一条链上那么他们的顺序会发生倒置这个和1.8也不一样

二:jdk1.8的优化
1:resize方法源码融入了红黑树,本质和1.7区别不大,但是在插入元素的时候循环旧数组内的元素时会进行判断,如果是普通节点直接和1.7一样放置;如果是红黑树结构,就调用split()方法进行拆分放置;如果是链表,则采用下面2中要分析的方式!!!!
2:在经过一次容量判断是否大于最大值之后在进行扩容,使用的扩容方法是2次幂的扩展,**所以元素要么在原来的位置,要么在原位置在移动2次幂的位置,**如下图:图(a)表示扩容前的key1和key2两种key确定索引位

基于ESP32 蓝牙游戏手柄设计 介绍使用 ESP32 并通过 BLE 通信的 设计手持游戏手柄,包含原理图与代码 阅读详情

相关推荐

XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD

XC95144XL-10TQG144I 属于 Xilinx 的 XC9500XL 高性能 CPLD 家族,是一颗面向 3.3V 低电压系统的可编程逻辑器件。该器件以小封装、高速响应和良好的系统兼容性为设计目标,常用作系统控制/ glue-logic、I/O 缓冲、状态机、总线桥接与接口协议前端等场景中的可重编程逻辑单元。产品支持现场(in-system)编程与 IEEE-1149.1 JTAG 边界扫描,能在系统板上直接更新逻辑。

2403_90082736的博客 1060

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

UI-TARS本地部署

UI-TARS是一个用于本地部署的交互控制模型,支持桌面应用的自动化操作。部署步骤包括:首先,从官方GitHub仓库下载项目源码和模型checkpoint;其次,使用vLLM框架进行本地模型部署,启动API服务;最后,通过客户端调用API实现功能。部署过程中可能遇到pynvml模块或模型配置问题,提供了相应的解决方案。此外,还支持通过UI-TARS-Desktop客户端进行本地桌面应用的交互控制。整体流程旨在帮助用户快速实现UI-TARS的本地部署与应用。

DYF的博客 2531

GStreamer 源代码入门

GStreamer 是一个高度模块化的多媒体框架,其源代码结构清晰,设计精良。

深之JohnChen的专栏 953

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

未连接互联网的银河麒麟v10安装g++,各种报错,如何处理?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1803

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 983

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1136

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: Java内存回收之可达性分析算法
IM_MESSI
博客等级 码龄8年 4粉丝 2原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值