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);</t>Set<t> bMinusA = new HashSet(setB); bMinusA.removeAll(setA);</t>- 若要对称差集,可合并:
new HashSet(aMinusB); diff.addAll(bMinusA);
不想改原集合?用 Stream(Java 8+)函数式写法
适合追求不可变语义或链式调用的场景,但性能略低于 removeAll()(因遍历 + 装箱):
Set<t> diff = setA.stream().filter(e -> !setB.contains(e)).collect(Collectors.toCollection(HashSet::new));</t>- 注意:
contains()在 HashSet 中是 O(1),整体仍是 O(n),但有额外对象开销
关键提醒
- 元素必须正确重写
equals()和hashCode(),否则差集结果可能出错 -
removeAll()接收的是Collection>,不限于 Set,也可以是 List 或数组转的集合 - 如果 setB 为 null,会抛
NullPointerException,建议提前判空
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











