本文目录导读:

- 使用
addAll()方法(最基础) - 使用 Stream API(Java 8+)
- 使用 Apache Commons Collections
- 自定义通用方法(支持任意集合类型)
- 保留重复元素的并集(多重集)
- 性能优化建议
在Java中,取两个集合的并集有多种方法,具体取决于你使用的集合类型和业务需求,以下是几种最常用的实现方式:
使用 addAll() 方法(最基础)
import java.util.*;
public class UnionExample {
public static void main(String[] args) {
Set<String> set1 = new HashSet<>(Arrays.asList("A", "B", "C"));
Set<String> set2 = new HashSet<>(Arrays.asList("B", "C", "D", "E"));
// 创建一个新集合来存放并集
Set<String> union = new HashSet<>(set1);
union.addAll(set2);
System.out.println("并集: " + union); // [A, B, C, D, E]
}
}
使用 Stream API(Java 8+)
import java.util.*;
import java.util.stream.*;
public class StreamUnionExample {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list2 = Arrays.asList(3, 4, 5, 6);
// 使用 Stream 的 concat
List<Integer> union = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
System.out.println("并集: " + union); // [1, 2, 3, 4, 5, 6]
}
}
使用 Apache Commons Collections
需要添加依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
public class CommonsUnionExample {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("A", "B", "C");
List<String> list2 = Arrays.asList("B", "C", "D");
// 返回一个新的集合
Collection<String> union = CollectionUtils.union(list1, list2);
System.out.println("并集: " + union); // [A, B, C, D]
}
}
自定义通用方法(支持任意集合类型)
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
public class GenericUnionExample {
// 通用并集方法
@SuppressWarnings("unchecked")
public static <T> Collection<T> union(Collection<T> col1, Collection<T> col2) {
Set<T> result = new HashSet<>(col1);
result.addAll(col2);
return result;
}
// 返回指定类型的集合
public static <T, C extends Collection<T>> C union(
Collection<T> col1,
Collection<T> col2,
Supplier<C> collectionFactory) {
C result = collectionFactory.get();
result.addAll(col1);
result.addAll(col2);
return result;
}
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(3, 4, 5);
// 返回 Set
Collection<Integer> union1 = union(list1, list2);
System.out.println("Set 并集: " + union1);
// 返回 ArrayList
ArrayList<Integer> union2 = union(list1, list2, ArrayList::new);
System.out.println("List 并集: " + union2);
// 返回 LinkedHashSet (保持插入顺序)
LinkedHashSet<Integer> union3 = union(list1, list2, LinkedHashSet::new);
System.out.println("LinkedHashSet 并集: " + union3);
}
}
保留重复元素的并集(多重集)
import java.util.*;
import java.util.stream.Collectors;
public class MultisetUnionExample {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("A", "A", "B", "C");
List<String> list2 = Arrays.asList("A", "B", "C", "C");
// 合并所有元素(包含重复)
List<String> unionWithDuplicates = new ArrayList<>(list1);
unionWithDuplicates.addAll(list2);
System.out.println("含重复的并集: " + unionWithDuplicates);
// [A, A, B, C, A, B, C, C]
// 使用 Guava 的 Multiset(需要引入 Guava 库)
// Multiset<String> multiset = HashMultiset.create();
// multiset.addAll(list1);
// multiset.addAll(list2);
}
}
性能优化建议
import java.util.*;
public class PerformanceUnionExample {
public static void main(String[] args) {
// 大数据量时,预先分配容量
Set<String> set1 = new HashSet<>(Arrays.asList("A", "B", "C"));
Set<String> set2 = new HashSet<>(Arrays.asList("B", "C", "D", "E"));
// 预估容量: set1.size() + set2.size()
Set<String> union = new HashSet<>(set1.size() + set2.size());
union.addAll(set1);
union.addAll(set2);
System.out.println("并集: " + union);
}
}
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
addAll() |
简单场景 | 代码简洁,无需额外依赖 | 修改原集合 |
| Stream API | Java 8+ | 函数式编程,并行处理 | 性能一般 |
| Apache Commons | 复杂集合操作 | 功能丰富 | 需要引入依赖 |
| 自定义方法 | 需要通用性 | 灵活可定制 | 需要自己实现 |
选择建议:
- 简单需求使用
addAll() - Java 8+ 项目可以使用 Stream API
- 大型项目推荐使用 Apache Commons Collections
- 需要特定集合类型时使用自定义方法