HashSet去重简洁高效但不保证顺序;LinkedHashSet可保持首次出现顺序;自定义对象需重写equals和hashCode;Stream.distinct()底层用LinkedHashSet实现且语义清晰。

用 HashSet 过滤列表重复数据,核心是利用其“自动去重”和“不保证顺序”的特性。如果只要结果无重复、不关心顺序,这是最简洁高效的方式。
直接转成 HashSet 去重(适合不需要保持原顺序)
把原始 List 构造为 HashSet,它会自动丢掉重复元素:
- 创建一个新
HashSet,传入原列表作为构造参数 - 再根据需要,转回
List或直接使用Set
List<string> list = Arrays.asList("a", "b", "a", "c", "b");
Set<string> uniqueSet = new HashSet(list);
List<string> uniqueList = new ArrayList(uniqueSet); // 顺序不确定</string></string></string>
用 LinkedHashSet 保持插入顺序
如果既要去除重复,又要保留元素第一次出现的顺序,用 LinkedHashSet 是最佳选择——它继承了 HashSet 的去重能力,又维护了插入序:
- 遍历原列表,逐个添加到
LinkedHashSet - 再转为
List,顺序与首次出现位置一致
List<integer> nums = Arrays.asList(1, 2, 3, 2, 4, 1, 5); Set<integer> orderedUnique = new LinkedHashSet(nums); List<integer> result = new ArrayList(orderedUnique); // [1, 2, 3, 4, 5]</integer></integer></integer>
注意 null 和自定义对象的去重逻辑
HashSet 判断是否重复,依赖对象的 equals() 和 hashCode() 方法:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 对
String、包装类等 JDK 内置类型,已默认实现,可直接用 - 对自定义类(如
User),必须重写equals()和hashCode(),否则即使内容相同也会被当作不同对象 -
null允许存入HashSet一次,多次添加也只保留一个
一行流式写法(Java 8+)
结合 Stream API,可以更函数式地完成去重:
List<string> unique = list.stream()
.distinct() // 底层就是用 LinkedHashSet 实现的
.collect(Collectors.toList());</string>
注意:distinct() 默认保持顺序,效果等同于用 LinkedHashSet,但语义更清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










