Java中求HashSet差集最直接方式是removeAll(),它修改原集合得A−B;需保留原集合时应先复制;对称差集可用交集辅助计算;Stream方式可实现不可变差集。

Java 中求两个 HashSet 的差集,最直接的方式是使用 removeAll() 方法——它会从调用方集合中移除所有存在于参数集合中的元素,结果即为“调用方减去参数方”的差集(A − B)。
使用 removeAll() 获取 A − B 差集
注意:removeAll() 会**修改原集合**。如果需要保留原始集合,务必先创建副本。
- 调用
setA.removeAll(setB)后,setA变为 A − B - 若不想改变
setA,应写成:Setdiff = new HashSet(setA); diff.removeAll(setB); - 元素类型必须正确重写
equals()和hashCode(),否则差集计算可能出错
获取对称差集(A Δ B:在 A 或 B 中,但不同时在两者中)
对称差集 = (A − B) ∪ (B − A),需两步操作:
- 先复制 A:
Set<t> symDiff = new HashSet(setA);</t>
- 再添加 B − A:
symDiff.addAll(setB); - 最后移除交集:
symDiff.removeAll(new HashSet(setA)); symDiff.removeAll(new HashSet(setB));—— 更简洁做法是用临时交集:Setintersection = new HashSet(setA); intersection.retainAll(setB); SetsymDiff = new HashSet(setA); symDiff.addAll(setB); symDiff.removeAll(intersection);
使用 Java 8 Stream 实现不可变差集(推荐用于函数式风格)
适合不想修改原集合、且偏好链式表达的场景:
Setdiff = setA.stream().filter(e -> !setB.contains(e)).collect(Collectors.toCollection(HashSet::new)); - 性能上,对大集合慎用
contains()(HashSet是 O(1),但频繁调用仍有开销);小集合或可读性优先时很实用 - 注意:
setB必须是支持高效contains()的集合(如HashSet),避免传入ArrayList导致 O(n) 查找
补充:retainAll() 是求交集,别混淆
setA.retainAll(setB) 会把 setA 修改为 A ∩ B(交集),不是差集。差集核心是 removeAll(),记住口诀:“要减谁,就 removeAll 谁”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











