retainall 是 arraylist 的原地交集操作,保留当前列表与指定集合共有的元素;需注意参数非 null、依赖 equals 判断、建议用 hashset 提升性能、重复元素和顺序均保持不变。

retainAll 是 ArrayList(实际是继承自 Collection 接口)的一个方法,用于**保留当前集合中也存在于指定集合中的元素**,也就是“求交集”,但它是**原地修改**操作——会直接改变原 ArrayList 的内容。
基本用法:调用 retainAll 保留共同元素
你只需将另一个集合(如另一个 ArrayList、HashSet 等)传入 retainAll 方法即可。执行后,原列表只留下和参数集合都有的元素:
- 原列表会被修改,不返回新列表
- 参数集合不能为
null,否则抛NullPointerException - 元素是否相等,取决于其
equals()方法实现(对自定义对象需重写equals和hashCode)
简单示例:两个整数列表求交集
// 示例代码
ArrayList<integer> list1 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)); ArrayList<integer> list2 = new ArrayList(Arrays.asList(3, 4, 5, 6, 7)); list1.retainAll(list2); // list1 被修改为 [3, 4, 5] System.out.println(list1); // 输出: [3, 4, 5] </integer></integer>
注意:list2 不受影响;list1 原地变为交集结果。
避免修改原列表:先复制再调用
如果不想改动原始数据,可以先创建副本:
- 用
new ArrayList(original)构造新列表 - 对副本调用
retainAll
// 安全做法
ArrayList<string> a = new ArrayList(Arrays.asList("a", "b", "c"));
ArrayList<string> b = new ArrayList(Arrays.asList("b", "c", "d"));
ArrayList<string> intersection = new ArrayList(a);
intersection.retainAll(b); // intersection = ["b", "c"]
// a 仍为 ["a", "b", "c"],未被修改
</string></string></string>
注意事项:性能与重复元素
retainAll 内部通常遍历当前列表,并检查每个元素是否在参数集合中存在(使用 contains)。因此:
- 若参数集合是
HashSet,查找更快(O(1) 平均),推荐用于大数据量 - 重复元素会被保留原样(比如
[1,1,2]和[1,2]交集仍是[1,1,2]) - 顺序保持原列表顺序,不排序也不去重
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











