Java中HashSet通过retainAll、addAll、removeAll实现交集、并集、差集,但均会修改原集合,故需先复制;交集为A∩B,保留共同元素;并集为A∪B,自动去重合并;差集为A−B,移除B中存在元素。

Java 的 HashSet 本身不直接提供交集、并集、差集的独立方法,但可以通过 Collection 接口定义的 retainAll()、addAll() 和 removeAll() 方法高效完成这些运算。关键在于:操作会**修改原集合**,所以通常需要先复制一份再计算。
交集(intersection)
保留当前集合中也存在于另一个集合的元素,即 A ∩ B。
使用 retainAll(),它会**只保留本集合中与参数集合共有的元素**:
- 必须确保调用方是副本,否则原集合会被修改
- 参数集合可以是任意
Collection,不限于HashSet
示例:
立即学习“Java免费学习笔记(深入)”;
Set<Integer> setA = new HashSet<>(Arrays.asList(1, 2, 3, 4));
Set<Integer> setB = new HashSet<>(Arrays.asList(3, 4, 5, 6));
<p>Set<Integer> intersection = new HashSet<>(setA); // 先复制
intersection.retainAll(setB); // → {3, 4}并集(union)
合并两个集合的所有不重复元素,即 A ∪ B。
用 addAll() 将另一个集合所有元素加入当前集合(自动去重):
- 同样建议基于副本操作,避免影响原始数据
- 因为
HashSet自带去重,无需额外处理重复项
示例:
立即学习“Java免费学习笔记(深入)”;
Set<Integer> union = new HashSet<>(setA);
union.addAll(setB); // → {1, 2, 3, 4, 5, 6}差集(difference,A - B)
获取在 A 中存在但不在 B 中的元素,即 A \ B。
使用 removeAll(),它会**从当前集合中移除所有在参数集合中出现的元素**:
- 注意这是“左差”,即调用方减去参数方
- 若需 B - A,需交换调用对象和参数
示例:
立即学习“Java免费学习笔记(深入)”;
Set<Integer> difference = new HashSet<>(setA);
difference.removeAll(setB); // → {1, 2}这些操作的时间复杂度均为 O(n + m),得益于 HashSet 的平均 O(1) 查找性能。只要记得先复制、再操作,就能安全又高效地完成集合运算。


















