必须使用迭代器自身的remove()方法才能安全删除,因ArrayList迭代器是fail-fast的,直接调用list.remove()会修改modCount导致ConcurrentModificationException;且it.remove()须在next()后立即调用,否则抛IllegalStateException。

Java 中 ArrayList 的 iterator() 方法配合 remove() 实现安全删除,核心在于:**必须使用迭代器自身的 remove() 方法,不能调用 ArrayList 的 remove()**,否则会触发 ConcurrentModificationException。
为什么不能直接用 ArrayList.remove()?
ArrayList 的迭代器是“快速失败”(fail-fast)的。当你用 for-each 或显式调用 iterator() 遍历时,底层会维护一个 modCount(修改计数器)。一旦你绕过迭代器、直接调用 list.remove(),modCount 就会改变,而迭代器内部的 expectedModCount 未同步更新,下一次调用 next() 或 hasNext() 时就会抛异常。
正确做法:用迭代器的 remove() 方法
迭代器的 remove() 是唯一被允许的删除方式,它会在删除后同步更新 expectedModCount,从而保持一致性。
- 必须在调用
next()之后立即调用remove(),否则抛IllegalStateException - 每次
next()后最多只能调用一次remove() - 不能在遍历开始前或最后一步后调用
remove()
示例代码:
立即学习“Java免费学习笔记(深入)”;
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "b", "d"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) {
it.remove(); // ✅ 安全删除
}
}
// 结果:["a", "c", "d"]
常见错误写法对比
-
错误1(for-each + list.remove):
for (String s : list) { if ("b".equals(s)) list.remove(s); }→ 抛异常 -
错误2(迭代器中调 list.remove):
it.remove()没调,却写list.remove(s)→ 抛异常 -
错误3(重复 remove): 连续两次
it.remove()不调next()→ 抛IllegalStateException
替代方案:removeIf(Java 8+)
如果只是按条件删除,推荐更简洁安全的 removeIf():
list.removeIf("b"::equals); // 内部已用迭代器安全实现
它本质就是封装了上述迭代器逻辑,语义清晰、不易出错,且支持 lambda 表达式。
不复杂但容易忽略:只要记住“删元素必须用当前迭代器的 remove”,就不会踩坑。


















