最常用且高效的方式是调用removeAll(Collection<?>)方法,它就地删除所有匹配元素并返回是否修改;需确保传入集合非null、使用equals语义匹配、避免遍历中直接remove引发ConcurrentModificationException,建议用HashSet提升查找性能。

Java 中 ArrayList 批量删除指定集合元素,最常用且高效的方式是调用 removeAll(Collection<?>) 方法。它会一次性移除当前列表中所有存在于指定集合中的元素,操作原列表、返回布尔值(是否发生修改)。
使用 removeAll() 直接批量删除
这是最简洁安全的做法,底层遍历当前列表并检查元素是否在目标集合中,满足条件即删除:
- 确保传入的集合不为
null,否则抛NullPointerException - 被删除的元素需满足
equals()语义匹配(不是引用相等) - 若 ArrayList 存在重复元素,所有匹配项都会被删掉
示例:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "b")); Set<String> toRemove = Set.of("b", "c"); list.removeAll(toRemove); // 结果:["a"]注意并发修改与迭代器安全
不要在 for-each 或普通 for 循环中边遍历边调用 remove(),会触发 ConcurrentModificationException。如果必须手动控制逻辑,改用迭代器:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Iterator.remove()是唯一安全的遍历中删除方式 - 但对“批量删指定集合”场景,这不如
removeAll()简洁高效
不推荐写法(会报错):
for (String s : list) { if (toRemove.contains(s)) list.remove(s); // ❌ 并发修改异常需要保留原列表?先复制再删
removeAll() 是就地修改。若原始列表不能改动,应先创建副本:
- 用构造函数复制:
new ArrayList<>(originalList) - 或用
List.copyOf()(Java 10+,返回不可变视图,不适合后续修改) - 再对副本调用
removeAll()
示例:
List<Integer> original = Arrays.asList(1, 2, 3, 4); List<Integer> filtered = new ArrayList<>(original); filtered.removeAll(List.of(2, 4)); // original 不变,filtered = [1, 3]性能提示:用 HashSet 提升查找效率
removeAll() 内部会对每个元素调用 collection.contains()。若传入的是 ArrayList 或 LinkedList,每次 contains() 是 O(n),整体退化为 O(n²);换成 HashSet 后,contains() 接近 O(1),整体接近 O(n):
- 把待删元素先转成
HashSet(尤其当数量较大时) - 避免反复调用
list.contains()类误用
推荐写法:
Set<String> targetSet = new HashSet<>(toRemoveList); // 比直接传 List 更快 list.removeAll(targetSet);

















