交集:复制首个列表后逐次调用retainAll;并集:用LinkedHashSet收集所有元素再转ArrayList;需保护原集合、重写equals/hashCode、按需去重。

Java 中 ArrayList 求交集和并集,核心是借助 Collection 接口提供的方法(如 retainAll、addAll),但要注意操作会**修改原集合**,所以通常建议先复制一份再处理。
求多个 ArrayList 的交集
交集指所有集合中都存在的元素。对多个集合(比如 list1、list2、list3),可逐个用 retainAll 累积筛选:
- 以第一个集合为基准(如 new ArrayList(list1)),避免改原始数据
- 依次调用
retainAll(list2)、retainAll(list3)…每一步只保留当前结果中也存在于下一个集合的元素 - 注意:元素是否重复、是否去重,取决于原始集合是否含重复项及你是否需要去重;若需唯一结果,最后可用
new ArrayList(new LinkedHashSet(result))去重保序
求多个 ArrayList 的并集
并集是所有集合元素合并后去重的结果(数学并集默认不重复):
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 创建一个空的
LinkedHashSet(保序且自动去重),遍历每个 ArrayList 并调用addAll() - 最后转成 ArrayList:
new ArrayList(unionSet) - 如果明确需要保留重复(如统计总出现次数),就不用 Set,直接用 ArrayList + 多次
addAll,但此时不是标准并集,而是“合并”
实用小技巧与避坑点
实际写代码时容易忽略这些细节:
-
别直接在原始集合上调用
retainAll或removeAll——它们会改变原集合内容 - 元素必须正确重写
equals和hashCode(尤其是自定义对象),否则交/并集逻辑失效 - 如果集合很大,用
Stream也能实现,例如:list1.stream().filter(list2::contains).filter(list3::contains).distinct().collect(Collectors.toList())但性能不如retainAll(后者底层用哈希查表),大数据量慎用contains遍历
一句话总结做法
交集:复制首个列表 → 连续 retainAll 其他列表;并集:用 LinkedHashSet 收集所有元素再转回 ArrayList。关键在保护原数据、确保对象可比较、按需决定是否去重。










