hashset不直接支持多集合交并差运算,需用retainall()、addall()、removeall()等方法或stream api实现;交集逐次收缩,为避免修改原集合须先复制;并集可addall()或stream合并;差集左结合且需判空;apache commons collections提供更简洁的工具方法。

HashSet 本身不直接支持多集合交并差运算,但可以通过 Java 集合工具类(如 Collections、Set 接口方法)或 Stream API 配合基础操作实现。关键在于:交集用 retainAll(),并集用 addAll(),差集用 removeAll() —— 这些都是原地修改,若需保留原集合,务必先复制。
多个 HashSet 的交集(所有集合共有的元素)
交集需逐个“收缩”:以第一个集合为基准,依次对其他集合调用 retainAll(),保留共同元素。
- 必须使用可变集合(如
new HashSet(set1))作为起点,避免修改原始数据 - 空集合参与交集结果为空;任意一个集合为空,最终交集也为空
- 示例:
Setresult = new HashSet(set1);
result.retainAll(set2);
result.retainAll(set3);
多个 HashSet 的并集(所有集合元素去重合并)
并集最简单:新建一个空 HashSet,依次调用 addAll() 即可。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 无需担心重复,HashSet 自动去重
- 推荐用 Stream 合并更函数式(尤其集合数量不固定):
Setresult = Stream.of(set1, set2, set3)
.flatMap(Set::stream)
.collect(Collectors.toSet());
多个 HashSet 的差集(A − B − C − …)
差集是左结合的:等价于 ((A − B) − C) − …,即从第一个集合出发,依次减去后续每个集合。
- 同样需复制起始集合:
Set<t> result = new HashSet(setA);</t> - 然后顺序调用
removeAll(setB)、removeAll(setC)… - 注意:
removeAll(null)会抛 NPE,传入前建议判空
进阶:用 Apache Commons Collections 简化多集合运算
若项目已引入 commons-collections4,可用 CollectionUtils 提供的静态方法:
-
CollectionUtils.intersection(set1, set2, set3)→ 交集(支持 varargs) -
CollectionUtils.union(set1, set2, set3)→ 并集 -
CollectionUtils.subtract(set1, set2, set3)→ 差集(只减第一个参数后的所有集合) - 这些方法返回新集合,不修改原集合,语义更清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










