Java中查找集合重复元素最常用高效方式是HashSet,利用add()返回false识别重复;需频次统计则用HashMap;Stream适合简洁场景;自定义对象须重写equals和hashCode。

Java中查找集合中的重复元素,核心思路是借助额外的数据结构记录已出现的元素,再通过遍历判断是否重复。最常用、高效且易懂的方式是用 HashSet 或 HashMap 辅助统计。
用HashSet快速检测并找出重复项
适用于只需要知道哪些元素重复、不关心重复次数的场景。利用 HashSet 的 add() 方法返回值(false 表示已存在)来识别重复:
- 创建一个空的
HashSet存储已见元素 - 遍历原集合,对每个元素调用
set.add(element) - 若返回
false,说明该元素此前已添加过,即为重复项 - 可将重复元素加入另一个集合(如
LinkedHashSet)去重保存
用HashMap统计频次后筛选重复
适合需要知道每个元素重复几次,或只保留出现超过 N 次的元素(如大于1次):
- 遍历原集合,用
map.put(element, map.getOrDefault(element, 0) + 1)累计次数 - 再遍历
map.entrySet(),筛选出value > 1的键值对 - 结果可转为 List 或直接打印,保留原始顺序可用
LinkedHashMap
使用Java 8 Stream简洁实现(仅限简单需求)
适合代码简洁优先、数据量不大、无需复用逻辑的场合:
立即学习“Java免费学习笔记(深入)”;
- 先用
stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()))分组计数 - 再用
entrySet().stream().filter(e -> e.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList())提取重复元素 - 注意:Stream 方式会遍历两次,且新建对象较多,大数据量时不建议用于性能敏感场景
处理自定义对象时的关键点
若集合中是自定义类(如 User),必须正确重写 equals() 和 hashCode(),否则 HashSet/HashMap 无法正常识别“相同”对象:
- 两个对象逻辑相等(如 id 相同)时,
equals()必须返回true - 只要
equals()返回true,它们的hashCode()就必须相同 - 推荐用 IDE 自动生成(如 IntelliJ 的 Alt+Insert → “equals and hashCode”)
基本上就这些。选哪种方法取决于你是否需要频次、是否处理自定义类型、以及对性能和可读性的侧重。实际开发中,HashSet 方案最常用,兼顾效率与清晰度。









