Java中HashSet求差集最直接方式是用removeAll()方法获取A−B,但会修改原集合;需保留原集合时应先复制,如new HashSet(setA).removeAll(setB);若需A−B和B−A,须分别计算;也可用Stream过滤实现不可变操作。

Java 中 HashSet 求两个集合的差集,最直接的方式是用 removeAll() 方法 —— 它会从调用方集合中移除所有存在于参数集合中的元素,结果就是“调用方减去参数方”的差集(即 A − B)。
使用 removeAll() 获取 A − B(推荐)
这是最常用、最高效的做法。注意:该操作会**修改原集合**,如果需要保留原始集合,务必先复制一份。
- 创建副本再操作:用
new HashSet(setA)构造新集合 - 调用
removeAll(setB),剩余元素即为 A − B - 示例:
想同时得到 A−B 和 B−A?手动计算两次
removeAll() 是单向的,不提供对称差集(即 A Δ B = (A−B) ∪ (B−A))。如需两者,分别计算:
Set<T> aMinusB = new HashSet<>(setA); aMinusB.removeAll(setB);Set<T> bMinusA = new HashSet<>(setB); bMinusA.removeAll(setA);- 若要对称差集,可合并:
new HashSet<>(aMinusB); diff.addAll(bMinusA);
不想改原集合?用 Stream(Java 8+)函数式写法
适合追求不可变语义或链式调用的场景,但性能略低于 removeAll()(因遍历 + 装箱):
立即学习“Java免费学习笔记(深入)”;
Set<T> diff = setA.stream().filter(e -> !setB.contains(e)).collect(Collectors.toCollection(HashSet::new));- 注意:
contains()在 HashSet 中是 O(1),整体仍是 O(n),但有额外对象开销
关键提醒
- 元素必须正确重写
equals()和hashCode(),否则差集结果可能出错 -
removeAll()接收的是Collection<?>,不限于 Set,也可以是 List 或数组转的集合 - 如果 setB 为 null,会抛
NullPointerException,建议提前判空


















