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

HashMap的table数组何时初始化?默认容量和扩容阈值是多少?

HashMap 的 table 数组何时初始化?

答案:
table 数组在第一次调用 put() 方法时初始化。
为什么?
HashMap 为了节省内存,采用了“懒加载”机制。即使用 new HashMap() 创建对象时,只是计算了参数(如容量、负载因子),并没有真正创建底层数组。只有当第一次插入数据(put)时,才会初始化 table 数组。

类比理解:
就像你买了一个书架(HashMap),但卖家不会直接寄给你,而是等你第一次需要放书(put)时,才根据你的需求(容量)组装好书架寄过来。


默认容量和扩容阈值是多少?

  1. 默认容量
    默认容量是 16(数组长度)。
    为什么是 16?
    16 是经验值,在性能和内存占用之间取得平衡。容量必须是 2 的幂(原因与哈希计算优化有关)。

  2. 默认扩容阈值
    默认阈值是 12(容量 × 负载因子)。
    负载因子(默认 0.75)的作用:
    阈值 = 容量 × 负载因子。当 HashMap 中的元素数量超过阈值时,触发扩容(数组翻倍)。


举个栗子 🌰

  1. 默认初始化:

    HashMap<String, Integer> map = new HashMap<>();
    
    • 此时 table 数组未初始化,容量和阈值均为 0。
    • 当第一次调用 map.put("a", 1) 时:
      • 初始化 table 数组为长度 16。
      • 计算阈值:16 × 0.75 = 12。
  2. 触发扩容:
    当插入第 13 个元素时,元素数量超过阈值 12,触发扩容:

    • 数组长度翻倍为 32。
    • 新阈值变为 32 × 0.75 = 24。

用户指定容量时会发生什么?

如果通过构造函数指定容量(如 new HashMap(10)):

  1. HashMap 会将其调整为最近的 2 的幂(例如 10 → 16)。
  2. 初始化时,阈值 = 调整后的容量 × 负载因子(例如 16 × 0.75 = 12)。

总结

场景初始化时机容量扩容阈值
默认构造函数第一次 put()1612(16×0.75)
指定容量的构造函数第一次 put()最近的 2 的幂容量 × 负载因子

关键点:

  • 容量始终是 2 的幂(优化哈希计算)。
  • 扩容是为了减少哈希冲突,保证性能。
http://www.lryc.cn/news/546732.html

相关文章:

  • 基于CURL命令封装的JAVA通用HTTP工具
  • docker学习笔记(1)从安装docker到使用Portainer部署容器
  • 数据集/API 笔记:新加坡PSI(空气污染指数)API
  • 计算机网络数据传输探秘:包裹如何在数字世界旅行?
  • 笔记:代码随想录算法训练营day36:LeetCode1049. 最后一块石头的重量 II、494. 目标和、474.一和零
  • Bitmap -> Bitmap安卓设备上的显示和内存
  • QT study DAY2
  • QT-自定义参数设计框架软件
  • VUE集成Live2d
  • 【CPP面经】科大讯飞 腾讯后端开发面经分享
  • el-card 结合 el-descriptions 作为信息展示
  • GaussDB自带诊断工具实战指南
  • LeetCode 链表章节
  • SSL证书和HTTPS:全面解析它们的功能与重要性
  • 正交投影与内积空间:机器学习的几何基础
  • Qt中txt文件输出为PDF格式
  • 《HelloGitHub》第 107 期
  • Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
  • AI数据分析:deepseek生成SQL
  • 力扣-动态规划-115 不同子序列
  • Qt C++ 开发 动态上下页按钮实现
  • 数据结构第五节:排序
  • 从文件到块: 提高 Hugging Face 存储效率
  • Android14 串口控制是能wifi adb实现简介
  • vue3中 组合式~测试深入组件:事件 与 $emit()
  • SQL-labs13-16闯关记录
  • 基于微信小程序的停车场管理系统的设计与实现
  • DAIR-V2X-R数据集服务器下载
  • table 拖拽移动
  • Linux使用笔记:Find Tree 命令