hashset通过retainall()、addall()、removeall()可实现交集、并集、差集运算,但会修改原集合;推荐用stream流式操作(如filter+contains或concat)获取不可变新集合,语义清晰且线程安全。

HashSet 本身不直接提供交集、并集等集合运算方法,但可以通过 Collection 接口定义的 retainAll() 和addAll() 方法高效实现。
求两个 HashSet 的交集(retainAll)
交集是指同时存在于两个集合中的元素。使用 retainAll() 方法,它会**修改调用方集合**,只保留也存在于参数集合中的元素:
- 原集合 A 调用
A.retainAll(B)后,A 就变成 A ∩ B - 注意:该操作会改变原集合,如需保留原始数据,应先复制一份(例如用
new HashSet(A)) - 示例:
Setset1 = new HashSet(Arrays.asList("a", "b", "c"));
Setset2 = new HashSet(Arrays.asList("b", "c", "d"));
Setintersection = new HashSet(set1);
intersection.retainAll(set2); // → {"b", "c"}
求两个 HashSet 的并集(addAll)
并集是两个集合所有不重复元素的总和。用 addAll() 将一个集合全部加入另一个集合即可(自动去重):
- 调用
A.addAll(B)后,A 变成 A ∪ B(同样会修改 A) - 若不想修改原集合,建议新建一个集合接收结果:
new HashSet(A) {{ addAll(B); }}或分步构造 - 示例:
Setunion = new HashSet(set1);
union.addAll(set2); // → {"a", "b", "c", "d"}
求差集(removeAll)
差集 A − B 表示在 A 中但不在 B 中的元素,用 removeAll() 实现:
-
A.removeAll(B)会从 A 中移除所有属于 B 的元素 - 同样注意是否需要保护原始集合,必要时先复制
- 示例:
Setdiff = new HashSet(set1);
diff.removeAll(set2); // → {"a"}(因为 "b","c" 在 set2 中)
更安全、不可变的写法(推荐用于业务逻辑)
避免意外修改原始集合,可封装为工具方法或使用 Stream(Java 8+),例如:
- 交集(Stream):
set1.stream().filter(set2::contains).collect(Collectors.toSet()) - 并集(Stream):
Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet()) - 这些方式不修改原集合,返回新集合,语义更清晰,适合函数式风格或并发场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











