Iterator的remove()只能在next()后立即调用一次,用于安全删除当前元素;多次调用、未调用next()或混用集合remove()会抛异常;推荐用removeIf或反向遍历替代。

Java 中 Iterator 的 remove() 方法只能在调用 next() 之后立即调用一次,否则会抛出 IllegalStateException。它不是用来“随意删除元素”的工具,而是为安全遍历中删除当前元素设计的机制。
remove() 的使用前提和限制
remove() 是 Iterator 接口定义的可选操作,但所有标准集合(如 ArrayList、LinkedList、HashSet)都支持。关键约束有:
- 必须先调用过
next(),且尚未调用过remove() - 不能在同一次迭代中连续调用两次
remove() - 不能与集合自身的
remove()(如list.remove(i))混用,否则可能引发ConcurrentModificationException - 不支持在
for-each循环中直接调用(因为没有暴露Iterator引用)
正确使用的典型写法
下面是在遍历中安全删除满足条件的元素的标准方式:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("target".equals(s)) {
it.remove(); // ✅ 正确:next 后立刻 remove
}
}
注意:it.remove() 删除的是上一次 next() 返回的那个元素,不是下个元素,也不是根据值查找后删除。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
常见错误及后果
以下写法都会出问题:
- 未调用 next() 就 remove →
IllegalStateException - 连续两次 remove →
IllegalStateException - 在 for-each 中写
it.remove()(编译不过,因为没 it 变量) - 一边用 for-each 遍历,一边调用
list.remove()→ConcurrentModificationException
替代方案:需要更灵活删除时怎么办?
如果逻辑复杂(比如要删多个、依赖索引、或需多次判断),推荐以下方式:
- 收集待删元素,遍历结束后统一调用
collection.removeAll(toRemove) - 使用
removeIf(Predicate)(Java 8+):例如list.removeIf(s -> s.startsWith("a")) - 反向遍历
for(int i = list.size()-1; i >= 0; i--),避免索引偏移

















