遍历list时应使用iterator.remove()安全删除元素,因其同步更新modcount;不可在增强for中调用list.remove(),否则抛concurrentmodificationexception;java 8+推荐用removeif简化条件删除。

遍历List时直接调用list.remove()会触发ConcurrentModificationException,这是Java集合的快速失败(fail-fast)机制在起作用。唯一安全的方式是使用迭代器自身的remove()方法——它专为边遍历边删除而设计。
为什么Iterator.remove是安全的
普通for循环或增强for循环中调用list.remove(),会改变集合结构但未同步更新迭代器的内部状态,导致modCount和expectedModCount不一致,抛出异常。而Iterator.remove()在删除元素后会主动同步修改计数器,维持一致性。
- 必须在调用
next()之后立即调用,否则抛IllegalStateException
- 每个
next()最多对应一次<code>remove(),重复调用会抛异常 - 不能和
list.remove()混用,否则仍可能触发并发修改异常
标准写法:用while循环配合hasNext/next
推荐显式使用Iterator接口,逻辑清晰、不易出错:
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.startsWith("A")) {
it.remove(); // 安全删除
}
}</string>
注意:不要在循环体内再调用list.remove(item),也不要嵌套其他遍历操作。
增强for循环无法直接使用remove
增强for本质是语法糖,底层仍用Iterator,但它隐藏了引用,你拿不到迭代器对象,所以it.remove()不可用。以下写法是错误的:
for (String s : list) {
if (s.contains("x")) {
list.remove(s); // ❌ 触发ConcurrentModificationException
}
}
如果坚持用增强for,只能先收集待删元素,遍历结束后统一移除(但需注意List实现类是否支持批量remove)。
替代方案:removeIf(Java 8+)
如果只是按条件过滤,Collection.removeIf(Predicate)更简洁且内部已封装安全逻辑:
list.removeIf(s -> s.length() > 5); // ✅ 线程安全(单线程场景)
它底层仍基于Iterator实现,但对开发者透明;注意它不适用于需要在删除前做复杂判断或副作用操作的场景。
不复杂但容易忽略——关键就三点:用迭代器、只在next后调、别混用集合方法。











