java set集合支持交、并、差等运算:交集用retainall()保留共有元素;并集用addall()合并去重;差集用removeall()移除共存元素;操作均会修改原集合,建议先复制再运算。

Java 中的 Set 接口本身不直接提供交集、并集、差集等数学集合运算方法,但可以通过 java.util.Collections 工具类或手动操作(利用 retainAll、addAll、removeAll)高效实现。关键在于理解这些操作会**修改原集合**,所以通常建议先复制集合再运算。
交集(intersection)
交集指两个集合中都存在的元素。使用 retainAll() 方法可实现:它会保留当前集合中也存在于指定集合中的元素,其余全部删除。
- 注意:该操作会改变原集合,若需保留原始数据,应先创建副本(如用
new HashSet(set1)) - 示例:
Set<string> intersection = new HashSet(setA); intersection.retainAll(setB);</string> - 结果集合类型取决于你新建时选用的实现类(如
HashSet无序,TreeSet自动排序)
并集(union)
并集是两个集合所有元素的去重合并。可用 addAll() 方法将一个集合的全部元素添加到另一个集合中(Set 天然去重)。
- 同样会修改原集合,推荐基于副本操作:
Set<string> union = new HashSet(setA); union.addAll(setB);</string> - 如果 setA 是
TreeSet,结果保持排序;若为HashSet,顺序不保证 - 不支持直接“不可变并集”,必须显式构造新集合
差集(A − B,即 A 减去 B)
差集指属于集合 A 但不属于集合 B 的元素。使用 removeAll() 方法:从当前集合中移除所有在指定集合中存在的元素。
- 示例:
Set<string> difference = new HashSet(setA); difference.removeAll(setB);</string> - 注意这不是对称差(symmetric difference),如需 A△B(即 (A−B) ∪ (B−A)),需分别计算再取并集
- 若 setB 包含 setA 中没有的元素,不影响结果,安全调用
使用 Apache Commons Collections(可选增强)
如果你项目中已引入 org.apache.commons:commons-collections4,可直接用 CollectionUtils 提供的静态方法,更语义化且支持不可变操作:
-
SetUtils.intersection(setA, setB)— 返回新交集,不修改原集合 -
SetUtils.union(setA, setB)— 返回新并集 -
SetUtils.difference(setA, setB)— 返回 A−B 差集 - 所有方法均返回不可修改视图或新实例(取决于具体实现),适合函数式风格
不复杂但容易忽略细节:务必区分“修改原集合”和“生成新集合”,根据业务是否需要保留原始数据来选择策略。标准库方案轻量,第三方库方案更简洁安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











