调用 HashMap 的 size() 方法可获取键值对数量,时间复杂度为 O(1);size() 返回实际元素个数,不等于底层数组容量;判断为空应优先使用 isEmpty();多线程环境下需用 ConcurrentHashMap 或同步机制保障 size() 结果一致性。

在 Java 中,获取 HashMap 的键值对数量(即元素个数),直接调用其 size() 方法即可。
使用 size() 方法获取元素个数
size() 是 Map 接口定义的方法,HashMap 继承自 AbstractMap,内部维护了一个 size 字段,每次增删操作都会更新它。因此该方法时间复杂度为 O(1),非常高效。
示例:
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
int count = map.size(); // 返回 3
System.out.println(count); // 输出:3
注意:size() 不等于容量(capacity)
size() 返回的是当前实际存储的键值对数量;而 HashMap 的“容量”(capacity)是指底层数组的长度,由构造函数或自动扩容决定,两者完全不同。
立即学习“Java免费学习笔记(深入)”;
- 刚创建空
HashMap:`size()` 为 0,但默认初始容量是 16 - 调用 `clear()` 后:`size()` 变为 0,容量不变
- 大量 put 后触发扩容:`size()` 增长,容量可能翻倍(如从 16 → 32)
判断是否为空的更推荐写法
如果只是想检查 HashMap 是否为空,建议用 isEmpty() 而不是 size() == 0,语义更清晰、可读性更好:
-
if (map.isEmpty()) { ... }✅ 推荐 -
if (map.size() == 0) { ... }⚠️ 功能正确,但略显冗余
线程安全场景下的注意事项
普通 HashMap 不是线程安全的。若在多线程环境中并发修改并调用 size(),可能返回不一致的结果(例如正在扩容时读取到中间状态)。此时应考虑:
- 使用
ConcurrentHashMap,它的size()方法会尽力返回准确值(在高并发下可能略有延迟,但比非同步 HashMap 更可靠) - 必要时配合外部同步(如
synchronized块)确保一致性


















