java中安全删除集合元素的唯一可靠方式是iterator.remove(),它专为边遍历边删设计,可避免concurrentmodificationexception;需先调next()再调remove(),且每个next()最多配一次remove()。

Java 中在遍历集合时安全删除元素,唯一可靠的方式是使用 Iterator.remove() —— 它专为“边遍历边删”设计,能避免 ConcurrentModificationException,但必须严格遵守调用时机。
为什么不能直接在 for-each 或普通 for 里删
for-each 循环本质是 Iterator 的语法糖,但它隐藏了迭代器对象,你无法调用 it.remove();一旦在循环体中写 list.remove(s),集合的 modCount 就会和迭代器缓存的 expectedModCount 不一致,立刻抛出异常。普通正向 for 循环调用 list.remove(i) 虽不抛该异常,但会因元素前移导致漏删(比如删掉索引 1 后,原索引 2 的元素移到 1,而 i 已变成 2)。
Iterator.remove() 的正确用法
它不是“用了就安全”,而是有明确状态约束:
- 必须先调用
it.next(),再调it.remove(),否则抛IllegalStateException - 每个
next()最多只能配一次remove(),连续两次调用会再次抛异常 -
remove()删除的是上一次next()返回的那个元素,不是按值查找匹配后删除 - 不能和
list.remove()混用,否则仍可能触发校验失败
标准写法示例
以删除字符串列表中所有 "b" 为例:
List
Iterator
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) {
it.remove(); // ✅ 安全,紧跟 next()
}
}
执行后 list 变为 ["a", "c"]。
更简洁的替代方案(Java 8+)
如果只是按条件过滤,推荐优先使用 Collection.removeIf():
- 语义清晰:
list.removeIf(s -> s.length() > 5); - 底层仍是 Iterator + remove(),同样安全
- 不适用于需要在删除前记录日志、做副作用操作或依赖删除顺序的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











