java合并两个list并去重的核心方法有四种:1.用linkedhashset保留插入顺序;2.用stream api的distinct()函数式去重;3.用treeset实现自然排序去重;4.手动遍历+contains判断(仅适用于小数据量)。

Java 中合并两个 List 并去重,核心思路是“先合并、再去重”,但具体实现方式取决于是否需要保持顺序、是否允许修改原集合、以及元素是否可比较或重写了 equals 和 hashCode。以下是几种常用且实用的方法:
用 LinkedHashSet 保留插入顺序去重
这是最常用也最推荐的方式,适合大多数场景:既去重,又保持元素首次出现的顺序(比如 list1 的元素在前,list2 的后追加)。
- 创建一个
LinkedHashSet,它底层基于哈希表 + 链表,能去重且维护插入顺序 - 依次添加两个 list 的所有元素(顺序决定谁优先)
- 再转回
ArrayList或其他需要的 List 实现
示例代码:
List<string> list1 = Arrays.asList("a", "b", "c");
List<string> list2 = Arrays.asList("b", "c", "d");
List<string> merged = new ArrayList(new LinkedHashSet(list1));
merged.addAll(new LinkedHashSet(list2)); // 注意:这样会把 list2 中新元素追加到末尾,但 list2 内部重复仍会被去重
// 更简洁写法:
List<string> result = new ArrayList(new LinkedHashSet() {{
addAll(list1);
addAll(list2);
}});
</string></string></string></string>
用 Stream API(Java 8+)一行搞定
函数式风格,简洁清晰,同样支持顺序保留(前提是源 list 有序,且使用 distinct())。
-
Stream.concat()合并两个流 -
distinct()基于元素的equals/hashCode去重 -
collect(Collectors.toList())收集为新 List
示例:
List<string> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
</string>
⚠️ 注意:distinct() 依赖对象正确实现 equals 和 hashCode;对自定义对象,务必重写这两个方法。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
用 TreeSet 实现自然排序去重
如果希望结果按自然顺序(或指定顺序)排列,且元素实现了 Comparable,可用 TreeSet。
- 自动去重 + 排序,不保证原始插入顺序
- 适用于 String、Integer 等天然可比类型,或自定义类实现
Comparable - 也可传入
Comparator自定义排序规则
示例:
List<string> result = new ArrayList(new TreeSet(list1)); result.addAll(new TreeSet(list2)); // 或直接用 TreeSet 合并后转 List // 更简写: List<string> result = new ArrayList(new TreeSet(Stream.concat(list1.stream(), list2.stream()).toList())); </string></string>
手动遍历 + contains 判断(小数据量、简单场景)
不推荐用于大数据量(时间复杂度 O(n²)),但逻辑最直白,适合教学或极简需求。
- 新建空 list
- 先加 list1 全部元素
- 遍历 list2,只添加
!newList.contains(item)的元素
注意:contains 对大 list 效率低,且依赖 equals 正确实现。
不复杂但容易忽略的是:去重行为完全依赖元素自身的 equals 和 hashCode。自定义对象务必重写这两个方法,否则默认按引用比较,永远不重复。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










