java中set交集用retainall()、并集用addall()、差集用removeall(),均为破坏性操作;需注意集合可变性、复制保护及equals/hashcode正确实现。

Java 中的 Set 接口本身不提供直接的交集、并集、差集方法,但它的实现类(如 HashSet、TreeSet)支持通过标准 API 配合集合操作完成这些逻辑。关键在于理解每个操作对原集合的影响,以及是否需要保留原始数据。
交集:用 retainAll() 保留共同元素
retainAll(Collection> c) 会修改调用方集合,只保留它和参数集合中都存在的元素。这是真正的“交集”操作,但注意它是**破坏性操作**(原集合被修改)。
- 确保目标集合是可变的(如
HashSet),unmodifiableSet或Collections.emptySet()调用会抛异常 - 若不想修改原集合,先复制一份:
new HashSet(setA).retainAll(setB) - 时间复杂度取决于底层实现,
HashSet下平均为 O(n),其中 n 是调用方集合大小
并集:用 addAll() 合并所有不重复元素
addAll(Collection extends E> c) 将参数集合中所有不在当前集合中的元素添加进来,天然满足 Set 去重特性,等价于数学并集(A ∪ B)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同样会修改原集合;如需新集合,建议创建副本再操作:
Set<t> union = new HashSet(setA); union.addAll(setB);</t> - 顺序无关(
HashSet无序),若需有序结果,可用TreeSet或手动排序 - 对空集合或 null 参数要提前判空,否则可能引发
NullPointerException
差集(A - B):用 removeAll() 删除另一集合中的元素
removeAll(Collection> c) 从当前集合中移除所有在参数集合中出现的元素,即 A − B(A 相对于 B 的差集)。
- 这也是破坏性操作;安全做法是先拷贝:
new HashSet(setA).removeAll(setB) - 注意不是对称差集(即 A Δ B = (A−B) ∪ (B−A)),如需对称差,需分别计算再合并
- 如果 setB 很大,建议将其转为
HashSet提升查找效率(removeAll内部会遍历调用方,对每个元素检查是否在参数集合中存在)
不复杂但容易忽略:所有这些操作都依赖 equals() 和 hashCode() 的正确实现。自定义对象作为元素时,务必重写这两个方法,否则交/并/差结果可能不符合预期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










