capacity是桶的数量即底层数组长度,必须为2的幂,默认16;size是当前键值对个数;threshold=capacity×loadfactor,扩容触发条件为size>threshold,如默认下第13个元素插入时扩容。

capacity 是桶的数量,也就是底层数组的长度;size 是当前已存的键值对个数;threshold 是触发扩容的临界点,等于 capacity × loadFactor。三者定位不同:capacity 描述“能装多少格”,size 描述“已经装了多少个”,threshold 描述“再装几个就得换更大的桶”。
capacity:桶的数量,决定散列表物理空间大小
capacity 指 HashMap 底层数组(table)的长度,即“桶”的总数。它必须是 2 的幂(如 16、32、64…),默认为 16(1 )。这个值不随 put 操作实时变化,只在扩容时翻倍(如从 16 → 32)。注意:capacity 不代表实际能安全存放的元素上限——真正限制插入的是 threshold。
- 构造时可指定初始 capacity,例如
new HashMap(32),但实际会自动调整为 ≥32 的最小 2 的幂(仍是 32) - capacity 影响 hash 计算效率:
index = hash & (capacity - 1)依赖 capacity 是 2 的幂才能用位运算快速取模 - 容量过小会导致频繁 resize;过大则浪费内存且降低缓存局部性
size:真实键值对数量,反映当前数据规模
size 是 HashMap 中所有链表和红黑树里 key-value 对的总个数,即 map.size() 返回的值。它每次成功调用 put() 或 remove() 后都会增减 1(重复 key 会覆盖,size 不变)。
- size 始终 ≤ capacity,但远小于 capacity 也很常见(因存在空桶、链表/树结构)
- size 不参与内部计算,仅用于对外暴露状态或判断空满(如
isEmpty()) - 即使所有元素都集中在同一个桶里(极端哈希冲突),size 仍准确统计总数
threshold:扩容开关,由 capacity 和 loadFactor 共同决定
threshold 是一个动态计算出的整数阈值,当 size 超过它时,HashMap 就必须扩容。它的公式固定为:threshold = capacity × loadFactor。默认 loadFactor 是 0.75,所以初始 capacity=16 时,threshold=12。
- threshold 不是硬编码常量,每次 resize 后都会重算(新 threshold = 新 capacity × loadFactor)
- 它只起“检查哨兵”作用:put 后若
++size > threshold,立即触发 resize - 注意不是“size ≥ threshold”才扩容,而是“size > threshold”——所以第 13 个元素插入时扩容,不是第 12 个
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











