Java中求集合差集核心用removeAll():A.removeAll(B)得A−B,需复制可修改集合;自定义对象须重写equals/hashCode;对称差集需组合计算;Stream方式适合只读场景。
Java 中找出两个集合的差集,核心是用 removeAll() 方法:它会从调用方集合中移除所有存在于参数集合中的元素,结果即为“调用方对参数方的差集”(A − B)。
这是最常用场景:保留集合 A 中有、但集合 B 中没有的元素。
new ArrayList(a) 或 new HashSet(a)),因为 removeAll() 会直接修改原集合removeAll() 返回 boolean,表示是否发生了变化,实际差集就是调用后剩下的元素示例:
List如果集合里是自定义对象(比如 User 类),removeAll() 能否正确识别“相同元素”,完全取决于该类是否重写了 equals() 和 hashCode()。
new User("Alice", 25) 实例,若未重写 equals,removeAll 不会把它们当作同一个元素移除@EqualsAndHashCode,或 IDE 自动生成这两个方法对称差集 = (A − B) ∪ (B − A),即“互斥部分”。Java 没有内置方法,但可以组合实现:
removeAll(B) 得到 A−BremoveAll(A) 得到 B−AaddAll())示例(用 Set 更合适,避免重复):
Set
moveAll(b);如果不想修改原集合,且偏好函数式风格,可用 Stream 过滤:
a.stream().filter(x -> !b.contains(x)).collect(Collectors.toList())b 是大集合时,contains() 效率依赖其底层实现;建议 b 是 HashSet(O(1) 查找),而非 ArrayList(O(n))基本上就这些。差集运算本身不复杂,但容易忽略可变性、对象相等性、性能这三点。