推荐用 addAll() 创建新集合,先以第一个 Set 初始化 HashSet 再调用 addAll(set2);Stream 方案一行简洁,Stream.concat().collect(toSet());Guava 的 Sets.union() 返回动态视图,非独立副本。

用 addAll() 构建新 Set(推荐)
这是最直观、性能稳定且无需额外依赖的方式:
- 先以第一个 Set 初始化一个新的 HashSet(或 LinkedHashSet 保序、TreeSet 排序)
- 再调用 addAll() 加入第二个 Set 的所有元素
- 自动去重,原集合完全不受影响
示例:
Set<String> merged = new HashSet<>(set1);<br>merged.addAll(set2);
用 Stream API 一行搞定(现代简洁)
适合 Java 8+,代码干净,语义明确:
- 用 Stream.concat() 合并两个流
- 直接 collect(Collectors.toSet()),无需显式
distinct()(Set 自动去重) - 同样不修改原始集合,生成的是全新实例
示例:
Set<String> merged = Stream.concat(set1.stream(), set2.stream())<br> .collect(Collectors.toSet());
用 Guava 的 Sets.union(轻量视图)
如果你项目已引入 Guava,这个方法创建快、内存省:
- Sets.union(set1, set2) 返回的是动态视图,不是新集合
- 原 Set 有增删,视图内容会同步变化
- 如需独立副本,得包装一层:
new HashSet(Sets.union(set1, set2))
选型关键点提醒
合并前确认几点,避免踩坑:
- 元素类型要一致,否则运行时可能抛 ClassCastException
- 若需保持插入顺序,用 LinkedHashSet 替代 HashSet
- 若需自然排序,直接用 TreeSet 初始化(注意元素必须可比较)
- 所有方式都天然支持 null 元素(除非用 TreeSet 且未指定 Comparator)

















