Java合并多个集合并去重的核心是利用集合自动去重特性:用HashSet实现无序合并,LinkedHashSet保持插入顺序,Stream.distinct()处理流式数据,自定义对象需重写equals和hashCode。

Java 中合并多个集合并去重,核心思路是利用集合的自动去重特性,选择合适的集合类型和合并方式。
使用 HashSet 合并多个 Set
如果原始数据已经是 Set(如 HashSet、TreeSet),最直接的方式是创建一个新的 HashSet,然后调用 addAll() 依次添加:
- 新建一个空的
HashSet - 对每个源集合调用
addAll() - 重复元素会被自动忽略
示例:
Set<String> set1 = new HashSet<>(Arrays.asList("a", "b"));
Set<String> set2 = new HashSet<>(Arrays.asList("b", "c"));
Set<String> set3 = new HashSet<>(Arrays.asList("c", "d"));
Set<String> merged = new HashSet<>();
merged.addAll(set1);
merged.addAll(set2);
merged.addAll(set3);
// 结果:[a, b, c, d](顺序不保证)
合并 List 或数组并去重
若原始数据是 List 或普通数组,可先转为流再用 distinct(),或直接构造 HashSet:
立即学习“Java免费学习笔记(深入)”;
-
Stream.concat()链接多个流,再distinct()+collect(Collectors.toSet()) - 更简洁:把所有元素收集到一个列表,再用
new HashSet<>(list) - 注意:
HashSet不保证插入顺序;如需有序,用LinkedHashSet
示例(流式):
List<String> list1 = Arrays.asList("x", "y");
List<String> list2 = Arrays.asList("y", "z");
Set<String> merged = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toSet());
保持插入顺序的合并
如果需要保留首次出现元素的顺序(比如按 list1 → list2 → list3 的顺序),推荐用 LinkedHashSet:
- 它继承
HashSet的去重能力,同时维护插入顺序 - 按顺序调用
addAll()即可实现“先到先得”去重 - 适用于合并多个有序集合且希望结果也有序的场景
示例:
Set<String> orderedMerged = new LinkedHashSet<>(); orderedMerged.addAll(list1); orderedMerged.addAll(list2); orderedMerged.addAll(list3); // 重复项不会打乱已有顺序
处理自定义对象去重
合并含自定义对象的集合时,必须确保对象正确重写了 equals() 和 hashCode() 方法,否则 HashSet 无法识别逻辑上的重复:
- 仅靠字段值判断相等性,不能依赖默认的内存地址比较
- IDE(如 IntelliJ)可一键生成这两个方法
- 若用
TreeSet,还需实现Comparable或传入Comparator
例如,对 User 对象按 id 去重,就要在 User 类中基于 id 实现 equals 和 hashCode。


















