hashset 是统计唯一元素数量最简洁高效的方式,因其基于 hashmap 实现、平均 o(1) 时间复杂度、自动去重,且 jdk 类型开箱即用,自定义类需保证 hashcode 与 equals 一致。

直接用 HashSet 存入所有数据,再调用 size() 方法即可获得唯一元素总数——这是最简洁、最高效的做法。
为什么 HashSet 适合统计唯一数量
HashSet 底层基于 HashMap 实现,插入和查找平均时间复杂度为 O(1),且自动去重。只要元素正确实现了 hashCode() 和 equals(),重复值会被自然忽略。
- 字符串、Integer、Long 等 JDK 内置类型已默认支持,可直接使用
- 自定义对象需确保 hashCode 和 equals 逻辑一致(例如用 Lombok 的 @Data 注解可自动生成)
- 不关心顺序时,比 TreeSet(O(log n) 插入)或 Stream.distinct()(额外开销)更轻量
基础写法:一行搞定统计
对原始数据集合(如 List
int uniqueCount = new HashSet(dataList).size();
如果数据来自文件、数据库或网络流,建议边读边 add,避免一次性加载全部数据到内存:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 for 循环或增强 for 遍历原始数据,逐个 add 到 HashSet
- 对超大数据源(如千万级),可考虑分批处理 + 调用 clear() 复用 HashSet 实例(注意线程安全)
注意内存与性能边界
HashSet 会占用额外内存存储哈希表结构,当唯一元素极多(如上亿)时:
- 可预估容量,初始化时指定初始大小(如
new HashSet(expectedSize)),减少扩容开销 - 若仅需计数、不需保留具体元素,可用 Boolean.TRUE 作为 value 的 HashMap 替代(但通常没必要,HashSet 已足够)
- 极端场景下考虑布隆过滤器(Bloom Filter)做近似去重,但会有误判率,且无法精确计数
常见误区提醒
别在循环里反复创建新 HashSet;也别用 contains() 判断后再 add —— add() 本身返回 boolean,已包含判断逻辑:
- ✅ 正确:
set.add(item);(返回 true 表示新增,false 表示已存在) - ❌ 冗余:
if (!set.contains(item)) set.add(item); - ⚠️ 注意 null:HashSet 允许存一个 null,但若原始数据含大量 null,需确认业务是否应将其视为有效唯一值
不复杂但容易忽略细节,关键是让数据“进得快、判得准、占得少”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










