当前位置: 首页 > news >正文

7. Java 中 HashMap 的扩容机制是怎样的?

​​​​​​HashMap 是基于哈希表的数据结构,其容量是动态调整的。当存储的元素数量增加时,为了保持较好的性能,HashMap 需要进行扩容。HashMap 的扩容机制是为了减少哈希碰撞,提高查询效率。

1. 初始容量和负载因子

  • 初始容量HashMap的初始容量是指哈希表创建时桶(bucket)数组的大小,默认初始容量为16

  • 负载因子HashMap的负载因子(load factor)用于衡量HashMap的容量增长阈值。默认负载因子是0.75,这意味着当HashMap中的元素数量达到当前容量的75%时,触发扩容。

2. 扩容的触发条件

  • HashMap中存储的元素数量达到“当前容量 * 负载因子”的阈值时,HashMap会触发扩容操作。默认情况下,当元素数量达到16 * 0.75 = 12时,就会进行扩容。

3. 扩容的过程

  • 容量翻倍:当HashMap触发扩容时,桶数组的容量会翻倍(新容量 = 旧容量 * 2)。

  • 重新哈希(rehash):扩容时,HashMap会将原有的所有键值对重新计算哈希码,并将它们重新分配到新的桶数组中。由于容量翻倍,哈希码的计算方式会发生变化,原本冲突在同一个桶中的元素,可能会被分配到不同的桶中,减少哈希冲突。

4. 示例代码:扩容的触发

以下代码演示了HashMap如何在元素数量达到一定程度时触发扩容:

import java.util.HashMap;
​
public class HashMapResizingExample {public static void main(String[] args) {// 创建一个HashMapHashMap<Integer, String> map = new HashMap<>();
​// 插入13个元素,默认容量为16,负载因子为0.75for (int i = 0; i < 13; i++) {map.put(i, "Value" + i);}
​// 打印HashMap的大小System.out.println("HashMap size: " + map.size());// 插入第14个元素时,触发扩容map.put(13, "Value13");
​// 再次打印HashMap的大小System.out.println("HashMap size after rehashing: " + map.size());}
}

5. 扩容的影响

  • 性能开销:扩容是一项开销较大的操作,因为它涉及到分配新的数组并将所有元素重新哈希。频繁的扩容操作会影响性能,因此在创建HashMap时,建议预估好元素数量并设置合适的初始容量,以减少扩容次数。

  • 线程安全HashMap本身不是线程安全的,在多线程环境下如果出现扩容,可能导致数据丢失或死循环。因此,在并发环境中使用HashMap时,推荐使用线程安全的替代品如ConcurrentHashMap

总结

  • 触发条件:当HashMap中存储的元素数量达到当前容量与负载因子的乘积时,触发扩容。

  • 扩容过程HashMap的容量翻倍,所有元素重新计算哈希值并重新分配到新的桶数组中。

  • 性能影响:频繁扩容可能带来性能问题,建议合理设置初始容量来减少扩容次数。

理解HashMap的扩容机制可以帮助你在使用它时做出更优化的设计和决策,尤其是在处理大量数据时。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iOS开发进阶(二十三):iOS 常见面试题汇总
  • uniapp h5手机如何打开本地跑的前端项目进行本地调试
  • 亿发工单管理系统助力五金行业智造升级:高效生产新篇章
  • [数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别
  • NGINX高性能web服务器
  • 20240826日报
  • XML 总结
  • 编译 wolfssl 库
  • Python中的比较运算符:掌握数据世界的较量艺术
  • IPv6 over IPv4隧道概述
  • 没及格,我猜这套华为软件测试面试题没几个人能及格
  • 景商场双目客流量摄像机,具有100°宽视角,识别范围广
  • 模拟实现STL中的unordered_map和unordered_set
  • 图神经网络实战(19)——异构图神经网络
  • Vue3-win7搭建vue3环境
  • C++11: atomic 头文件
  • Docker: 容器互访的三种方式
  • in typeof instanceof ===这些运算符有什么作用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js继承的实现方法
  • linux学习笔记
  • Magento 1.x 中文订单打印乱码
  • Redash本地开发环境搭建
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue 个人积累(使用工具,组件)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 编写符合Python风格的对象
  • 从零开始学习部署
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解决iview多表头动态更改列元素发生的错误
  • 浅谈web中前端模板引擎的使用
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​数据链路层——流量控制可靠传输机制 ​
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)php投票系统 毕业设计 121500
  • (回溯) LeetCode 131. 分割回文串
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (万字长文)Spring的核心知识尽揽其中
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 物件導向與老子思想 (OO)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net Core 微服务之Consul(三)-KV存储分布式锁