安全删除 ArrayList 元素的方法有四种:① Iterator.remove()(需先调用 next());② 倒序 for 循环;③ 收集待删元素后批量删除;④ Java 8+ 的 removeIf()。

在 Java 中遍历 ArrayList 时直接调用 list.remove() 会抛出 ConcurrentModificationException,因为普通 for 循环或增强 for 循环(foreach)底层使用的是 Iterator,而它检测到集合被结构化修改(如 add/remove 元素)就会快速失败。
使用 Iterator 的 remove() 方法
这是最常用、最安全的方式。必须在调用 iterator.next() 之后、且仅在刚返回的元素上执行 iterator.remove():
- 不能在没有调用
next()时调用remove() - 不能连续调用两次
remove()(会抛IllegalStateException) - 该方法删除的是上一次
next()返回的元素,与索引无关
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("target".equals(s)) {
it.remove(); // ✅ 安全删除
}
}倒序 for 循环(从 size-1 到 0)
适用于需要根据索引判断是否删除的场景。倒序可避免因前面元素删除导致后续元素索引前移、跳过检查的问题:
- 正序循环中删掉索引 i 的元素后,原 i+1 位置的元素移到 i,但循环变量已自增,该元素就被跳过了
- 倒序则不会影响尚未访问的索引(即更小的索引)
for (int i = list.size() - 1; i >= 0; i--) {
if ("target".equals(list.get(i))) {
list.remove(i); // ✅ 安全删除
}
}收集待删元素,遍历结束后批量删除
适合删除条件复杂、或需多次判断的场景。先遍历记录要删的对象或索引,再统一处理:
立即学习“Java免费学习笔记(深入)”;
- 用
ArrayList<String> toRemove = new ArrayList<>()收集匹配项 - 最后调用
list.removeAll(toRemove)(注意:要求元素重写了正确的equals()) - 或用
toRemove.forEach(list::remove),但不推荐——仍可能因重复值误删
List<String> toRemove = new ArrayList<>();
for (String s : list) {
if (s.length() > 5) {
toRemove.add(s);
}
}
list.removeAll(toRemove); // ✅ 安全使用 removeIf()(Java 8+)
简洁、函数式、线程安全(对单个集合操作而言),内部由 ArrayList 自己实现迭代与删除逻辑,规避了外部迭代器限制:
- 参数是
Predicate<E>,返回 true 表示要删除 - 底层采用类似倒序遍历的策略,效率高且无需手动管理迭代
- 一行代码解决,语义清晰
list.removeIf(s -> s.startsWith("A") || s.length() == 0); // ✅ 安全且简洁


















