HashSet 获取元素总数直接调用 size() 方法,时间复杂度 O(1),返回当前唯一元素个数,不等于底层容量,非线程安全场景下并发修改可能导致结果不一致。

Java 中 HashSet 计算元素总数量(即当前包含多少个元素)非常简单,直接调用 size() 方法即可。
使用 size() 方法获取元素个数
size() 是 HashSet 继承自 Collection 接口的标准方法,它返回当前集合中实际存储的唯一元素个数。这个值是 O(1) 时间复杂度,内部直接返回一个计数器字段,不遍历元素,效率很高。
- 即使 HashSet 内部底层用了哈希表(数组 + 链表/红黑树),
size()也不需要重新统计; - 添加重复元素(如两次 add("a"))不会影响 size,因为 HashSet 自动去重;
- 删除元素后,size 会实时更新。
示例代码
Java
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复,不生效
System.out.println(set.size()); // 输出:2
注意:不要混淆 size() 和容量(capacity)
有人会误以为“大小”是指底层哈希表的数组长度(即 capacity),但 size() 不等于 capacity:
立即学习“Java免费学习笔记(深入)”;
-
size()是逻辑大小(有多少个不同元素); - capacity 是内部数组长度,HashSet 没有公开的 capacity 获取方法,也不应依赖它;
- 如果真需要估算内部结构,可通过反射或 JOL 工具查看,但日常开发完全没必要。
线程安全场景下需额外注意
普通 HashSet 不是线程安全的。如果多个线程并发修改,size() 可能返回不一致的结果(例如正在扩容时读取)。此时应:
- 改用
ConcurrentHashMap.newKeySet()(Java 8+)获得线程安全的 Set; - 或用
Collections.synchronizedSet(new HashSet()),但调用 size() 仍需手动同步(否则可能读到中间状态); - 推荐优先使用
ConcurrentHashMap.newKeySet(),它的size()是弱一致性,适合大多数并发统计需求。

















