默认初始容量为16、加载因子为0.75,是空间利用率与查询性能的工程最优解:16为2的幂以支持高效位运算索引计算,0.75则平衡哈希冲突概率与内存使用率。

HashMap 默认容量是 16,加载因子默认是 0.75,这两个值在绝大多数场景下无需手动调整,但理解它们的含义和设置逻辑,能帮你写出更高效、更可控的代码。
默认值是什么,为什么是这个数
Java 中 HashMap 的默认初始容量为 16(即底层数组长度为 16),默认加载因子为 0.75f。这两个值不是随意定的:
- 容量取 2 的幂次方(如 16、32、64)是为了配合位运算 index = (n - 1) & hash 快速定位桶位置,比取模
%更高效; - 加载因子 0.75 是时间与空间的折中:太小(如 0.5)会导致数组过早扩容、内存浪费;太大(如 0.9)则哈希冲突概率上升,链表或红黑树变长,影响查询性能。
如何自定义初始容量
如果你大致知道要存多少个键值对,建议显式指定初始容量,避免多次扩容带来的性能开销。计算方式为:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 设预估元素数量为 n,加载因子为 0.75,那么理想初始容量应 ≥ n / 0.75;
- 再向上取最近的 2 的幂次方 —— HashMap 构造时会自动调用
tableSizeFor()处理,比如传入 12,实际初始化容量为 16;传入 20,结果是 32。 - 示例:
new HashMap(32)表示明确使用容量 32;new HashMap(100)实际容量会变成 128。
加载因子可以改,但通常不建议
加载因子可通过构造函数指定,例如 new HashMap(16, 0.5f) 或 new HashMap(32, 0.9f),但要注意:
- 值必须 > 0 且非 NaN,否则抛
IllegalArgumentException; - 设为 0.5 会让扩容阈值提前(如容量 16 时,阈值变为 8),适合对内存敏感、写少读多的场景;
- 设为 0.9 虽节省空间,但显著增加哈希冲突概率,尤其在 key 的
hashCode()分布不均时,可能频繁触发树化或链表遍历,拖慢get()性能。
扩容的实际触发条件
扩容不是看“数组是否填满”,而是看元素个数是否超过 threshold(阈值):
- 阈值 = 当前容量 × 加载因子(向下取整后用于判断);
- 首次 put 时才真正初始化数组,此时若未指定容量,就用默认 16;
- 一旦 size > threshold,就会扩容为原容量的 2 倍,并重新哈希所有已有元素 —— 这是较重的操作,所以预设合理容量很关键。

















