hashset求并集推荐用addall()方法,先复制原集合再合并,时间复杂度o(n+m),自动去重;也可用stream.concat实现不可变操作,但性能略低;需确保元素正确重写hashcode()和equals()。

HashSet 本身没有直接提供“并集”方法,但可以用 addAll() 方法轻松实现:把一个集合的所有元素加到另一个集合里,结果就是并集。
用 addAll() 实现并集(推荐)
这是最常用、最高效的方式。注意:操作会修改原集合,如果不想改变原始数据,先复制一份。
- 创建副本再合并:避免污染原始集合
- HashSet 是无序且去重的,所以合并后自动去重,天然适合求并集
- 时间复杂度接近 O(n + m),效率高
示例代码:
HashSet<string> set1 = new HashSet(Arrays.asList("a", "b", "c"));
HashSet<string> set2 = new HashSet(Arrays.asList("c", "d", "e"));
// 方式1:修改 set1,得到并集
HashSet<string> union = new HashSet(set1); // 先复制
union.addAll(set2); // 把 set2 全加进来
System.out.println(union); // [a, b, c, d, e](顺序可能不同)
</string></string></string>
用 Stream 流式处理(Java 8+)
适合函数式风格或需要链式操作的场景,不修改原集合,但性能略低于 addAll()。
- 用 Stream.concat 合并两个集合的流,再 collect 到新 HashSet
- 同样自动去重,语义清晰
示例代码:
HashSet<string> union = Stream.concat(set1.stream(), set2.stream())
.collect(Collectors.toCollection(HashSet::new));
</string>
注意事项
- 元素必须正确重写 hashCode() 和 equals(),否则去重和查找会出错
- 如果要保留原始集合不变,务必先 new HashSet(original) 复制
- 并集结果是新的 HashSet,不是视图,后续修改不影响原集合
不推荐的方式:手动遍历 add()
虽然可行,但没必要——addAll() 内部已做优化,手动循环既啰嗦又容易出错。
- addAll() 底层做了批量处理和容量预估,比单个 add() 更快
- 少写代码,少出 bug











