Iterator.remove()是遍历中安全删除元素的唯一方式,必须在next()后立即调用且仅一次,不可混用集合remove()或并发修改,否则抛IllegalStateException或ConcurrentModificationException。

Iterator 的 remove() 方法只能在调用 next() 之后立即调用一次,且必须由当前迭代器执行,不能用于并发修改或多次调用。
remove() 的使用前提
Iterator.remove() 是唯一安全删除集合元素的方式(在遍历过程中),前提是:
- 必须先调用过 next() 方法,否则抛出 IllegalStateException
- 每次 next() 后最多只能调用一次 remove(),重复调用会再次抛出 IllegalStateException
- 不能和集合自身的 remove() 方法混用(比如 list.remove(i)),否则可能触发 ConcurrentModificationException
- 该方法删除的是上一次 next() 返回的元素
正确使用示例
以 ArrayList 为例:
ListIterator
while (it.hasNext()) {
String s = it.next();
if ("c".equals(s)) {
it.remove(); // 安全删除 "c"
}
}
执行后 list 变为 [a, b, d]。注意:这里没有用索引、没调集合本身的 remove,全程只通过迭代器操作。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
常见错误与后果
以下写法都会出问题:
- 未调 next() 就 remove() → IllegalStateException
- 连续两次 remove()(中间没 next)→ IllegalStateException
- 遍历时用 list.remove(obj) → ConcurrentModificationException(fail-fast 机制触发)
- 多线程共用同一个 Iterator → 行为不确定,通常抛异常或产生脏数据
替代方案参考
如果逻辑复杂,或需批量删除,可考虑:
- 收集待删元素,遍历结束后用 removeAll()
- JDK 8+ 使用 Collection.removeIf(Predicate)(内部仍用迭代器,但封装更安全)
- 对 List,可用普通 for 倒序遍历(从 size-1 到 0),避免索引错位

















