retainall是arraylist的交集操作方法,用于保留当前列表中也存在于指定集合的元素并直接修改原列表;参数为collection类型,若为null抛nullpointerexception,判断依据为equals()而非==,推荐传入hashset以提升性能。

retainAll 是 ArrayList 的一个方法,作用是“只保留当前集合中也存在于指定集合里的元素”,也就是取两个集合的交集,并直接修改原集合。
retainAll 的基本用法
它接收一个 Collection 类型参数(比如另一个 List、Set 等),遍历当前 ArrayList,把不在参数集合中的元素全部删掉。
- 调用后原 ArrayList 被修改,不会返回新集合
- 如果参数为 null,会抛出 NullPointerException
- 元素是否被保留,取决于 equals() 方法的逻辑(不是 ==)
简单示例:保留共同姓名
假设你有两个名单,想找出都报名了的人:
List<string> allStudents = new ArrayList(Arrays.asList("张三", "李四", "王五", "赵六"));
List<string> presentToday = Arrays.asList("李四", "王五", "孙七");
allStudents.retainAll(presentToday); // 执行后 allStudents 变为 ["李四", "王五"]
</string></string>
注意事项和常见坑
- null 元素要小心:如果原列表含 null,而参数集合不包含 null,那 null 会被删掉;如果参数集合含 null,需确保 equals 逻辑支持(比如用 ArrayList 本身没问题,但某些自定义集合可能不支持)
- 性能考虑:retainAll 内部会对参数集合调用 contains()。如果传入的是 ArrayList,每次 contains 都是 O(n);换成 HashSet,整体复杂度可从 O(m×n) 降到 O(m+n)
- 并发修改风险:不能在遍历 ArrayList 的同时调用 retainAll,否则可能抛 ConcurrentModificationException
实用建议:提升效率的小技巧
当要保留的“目标集合”较大时,先转成 HashSet 再传入:
Set<string> targetSet = new HashSet(presentToday); allStudents.retainAll(targetSet); // 更快,尤其 presentToday 很大时 </string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











