HashMap 的扩容机制

目录

一、HashMap 基本架构概览

二、扩容机制全解析

负载因子

扩容阈值

扩容操作步骤详解

三、代码实例呈现

四、总结与启示


在 Java 的世界里,HashMap 占据着极为重要的一席之地。它依托哈希表来构建,这种设计使得其在插入、删除以及查找操作上能够展现出相当快速的效率。不过,就像任何事物在面临规模增长时都会遭遇挑战一样,随着 HashMap 中元素数量的持续攀升,它的性能表现可能会大打折扣。为了能够始终维持高效的运行状态,HashMap 巧妙地引入了扩容机制。在接下来的内容中,我们将深入到 HashMap 的扩容机制内部,一探究竟,并且还会附上相应的代码示例来辅助理解。

一、HashMap 基本架构概览

在我们一头扎进扩容机制的复杂细节之前,先来简单回顾一下 HashMap 的基础结构。HashMap 主要是借助数组和链表(需要注意的是,在 Java 8 及其后续版本中,一旦链表的长度超出一定限度,链表就会被自动转换为红黑树)来实现数据存储的。HashMap 中的元素会被存放在数组的特定索引位置,而这个位置是通过哈希函数对键(Key)进行计算得出哈希值后确定的。

二、扩容机制全解析

当 HashMap 内部的元素数量累积到某个特定的界限时,扩容操作就会被触发,以此来确保操作效率不会因为元素过多而受到严重影响。这个特定的界限是由当前容量(capacity)与负载因子(load factor)这两个因素共同作用决定的。

负载因子

负载因子,从本质上来说,是一个用于衡量 HashMap 被填满程度的关键参数。它的计算方式是用 HashMap 中所包含的元素数量除以桶(bucket)的数量。在 Java 中,HashMap 默认设定的负载因子为 0.75f。

扩容阈值

扩容阈值的计算公式是:capacity * loadFactor。也就是说,当 HashMap 中的元素数量超过了由这个公式计算得出的阈值时,扩容操作就会紧锣密鼓地展开。

扩容操作步骤详解

  1. 首先,会创建一个全新的 Node 数组,这个新数组的容量将会是原数组容量的两倍。这就好比是为数据的存储开辟了一片更为广阔的空间,以容纳更多的元素。
  2. 接下来,需要对原 HashMap 中的每一个元素进行遍历操作。在遍历的过程中,针对每个元素,都要依据其键重新计算在新数组中的存储位置。这一步骤确保了元素在新的数组环境下能够被正确地安置。
  3. 最后,把原 HashMap 中的所有元素依次重新插入到新创建的数组之中,从而完成整个扩容过程,使得 HashMap 在新的容量基础上能够继续高效地运作。

三、代码实例呈现

以下是一段简化后的代码,用于展示 HashMap 的扩容机制:

import java.util.HashMap;public class HashMapExample {// 内部节点类,用于表示 HashMap 中的元素private static class Node {int key;int value;Node next;Node(int key, int value, Node next) {this.key = key;this.value = value;this.next = next;}}// 存储元素的数组private Node[] buckets;// 当前 HashMap 中元素的数量private int size = 0;// 负载因子,设定为默认值 0.75fprivate final float loadFactor = 0.75f;// 扩容阈值private int threshold; // 构造函数,初始化 HashMap 的容量并计算扩容阈值public HashMapExample(int initialCapacity) {buckets = new Node[initialCapacity];threshold = (int) (initialCapacity * loadFactor);}// 向 HashMap 中插入元素的方法public void put(int key, int value) {// 判断当前元素数量是否即将达到扩容阈值,如果是,则进行扩容操作if (size + 1 >= threshold) {resize();}// 计算元素在数组中的索引位置int index = hash(key);Node node = buckets[index];// 遍历链表,查看是否存在相同的键,如果有则更新对应的值for (; node!= null; node = node.next) {if (node.key == key) {node.value = value;return;}}// 如果不存在相同的键,则将新元素插入到链表头部buckets[index] = new Node(key, value, buckets[index]);size++;}// 哈希函数,用于计算键的哈希值并确定在数组中的位置private int hash(int key) {return (key ^ (key >>> 16)) & (buckets.length - 1);}// 扩容方法private void resize() {// 创建新的数组,容量为原数组的两倍Node[] newBuckets = new Node[buckets.length * 2];// 遍历原数组中的每个元素for (Node node : buckets) {while (node!= null) {// 重新计算元素在新数组中的位置int index = hash(node.key);Node next = node.next;// 将元素插入到新数组的对应位置newBuckets[index] = new Node(node.key, node.value, newBuckets[index]);node = next;}}// 更新数组引用和扩容阈值buckets = newBuckets;threshold = (int) (buckets.length * loadFactor);}
}

四、总结与启示

HashMap 的扩容机制无疑是保障其高性能表现的核心要素之一。通过在恰当的时机进行扩容操作,HashMap 能够有效地控制哈希冲突发生的概率,进而始终保持高效的操作效率。对于我们这些在日常开发工作中频繁使用 HashMap 的开发者来说,深入透彻地理解 HashMap 的扩容机制具有极为重要的意义,它能够帮助我们更加合理、高效地运用 HashMap 来解决各种实际的编程问题,避免因对其内部机制的不了解而导致的性能瓶颈或错误使用。

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

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

相关文章

大数据新视界 -- 大数据大厂之 Hive 数据安全:权限管理体系的深度解读(上)(15/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

RT-DETR融合Inner-IoU及相关改进思路

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Inner-IoU: More Effective Intersection over Union Loss with Auxiliary Bounding Box》 一、 模块介绍 论文链接:https://arxiv.org/abs/2311.02877 代码链接&a…

在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍 阿里云对象存储服务(OSS)是一种高效、安全和成本低廉的数据存储服务,可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS,并实现访问文件。 1. 准备工作 1.1 开通 OSS 服务 登录阿里云…

Java项目中加缓存

Java项目中加缓存 1.更新频率低;但读写频率高的数据很适合加缓存; 2.可以加缓存的地方很多:浏览器的缓存;CDN的缓存;服务器的缓存; 本地内存;分布式远端缓存; 加缓存的时候不要…

Vuex —— Day1

vuex概述 vuex是vue的状态管理工具,可以帮我们管理vue通用的数据(多组件共享的数据) vuex的应用场景: 某个状态在很多个组件中都会使用(eg.个人信息)多个组件共同维护一份数据(eg.购物车&…

【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践

关于Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的实践内容方面,我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面,然后发送给客户端。这使得用户在首次访问时能够…

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目,通过学习FM调制过程熟悉信号处理的一个简单流程,进而熟悉…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名,并保存结果到文件中 解题思路如下: 1.读入txt文件,按行读入 2.处理数据 (1)计算每个同学的总分平均分 import s…

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001,这两者都是Level-1路由器,AR3、AR4的系统ID采用0000.0000.000x格式,其中x为设备编号 AR1上存在三个业务网段A、B、C(分别用Loopback1、2、3接…

第J7周:对于RenseNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、前言1、导入包2、分组卷积模块3、残差单元4、堆叠残差单元5、搭建ResNeXt-50网络 二、问题思考 电脑环境: 语言环境:Pyth…

某充电桩业务服务内存监控和程序行为分析

原作者:展贝 原文地址:https://mp.weixin.qq.com/s/nnYCcVtwowvmj7Zn9XLIUg 在当今数据驱动的环境中,理解内存指标和程序行为对于确保应用程序的性能和可靠性至关重要。在依赖实时数据处理和高可用性的行业中尤其如此。通过利用可观测工具&am…

基于SpringBoot共享汽车管理系统【附源码】

基于SpringBoot共享汽车管理系统 效果如下: 系统注册页面 系统登陆页面 系统管理员主页面 用户信息管理页面 汽车投放管理页面 使用订单页面 汽车归还管理页面 研究背景 随着计算机技术和计算机网络的逐渐普及,互联网成为人们查找信息的重要场所。二十…

计算机网络基础(2):网络安全/ 网络通信介质

1. 网络安全威胁 网络安全:目的就是要让网络入侵者进不了网络系统,及时强行攻入网络,也拿不走信息,改不了数据,看不懂信息。 事发后能审查追踪到破坏者,让破坏者跑不掉。 网络威胁来自多方面&#xff1a…

Cesium K-means自动聚合点的原理

Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库,用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据,并允许开发者对大规模的地理数据进行可视化展示。在一些应用中,尤其是当处理大量地理坐标点时&#…

JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述 随着 Web 应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量,提高用户体验,我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前,TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore,完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

vitess使用记录:vtctldclient,设置分表规则

继续探索未完成的事情。 vitess使用记录系列已经写了好几篇了,记录了在测试过程中遇到的各种问题。《vitess使用:从部署到go客户端连接查询》、《vitess使用记录:vtctldclient》、《vitess使用:基于源码运行vtctldclient工具》整…

houdini肌肉刷pin点的方法

目标:产生gluetoanimation这个属性 主要节点:attribute paint(或者muscle paint) 步骤1: 导入肌肉资产 导入的是rest shape的肌肉 在有侧边栏可以打开display group and attribute list,方便查看group。不同的肌肉块按照muscl…

10个Word自动化办公脚本

在日常工作和学习中,我们常常需要处理Word文档(.docx)。 Python提供了强大的库,如python-docx,使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本,帮助新…