必须用 iterator.remove() 因为 java 集合迭代器是 fail-fast 的,直接调用集合 remove() 会触发 concurrentmodificationexception;iterator.remove() 同步更新状态,但须严格遵循“next() 后立即 remove()”规则。

在 Java 中,只能通过 Iterator 的 remove() 方法 安全地在遍历集合时删除元素,直接调用集合自身的 remove()(比如 list.remove())会抛出 ConcurrentModificationException。
为什么必须用 Iterator.remove()?
Java 集合(如 ArrayList、HashSet)的迭代器是“快速失败”(fail-fast)的。当你用普通 for 循环或增强 for 循环遍历时,如果直接修改集合结构(增/删),迭代器检测到内部 modCount 变化,就会立即抛异常。而 Iterator.remove() 是唯一被设计为与当前迭代状态同步的删除方式——它会在删除后同步更新迭代器状态,避免冲突。
正确写法:先 next(),再 remove()
必须严格遵守“调用一次 next() 后才能调用一次 remove()”的规则。不能连续调用两次 remove(),也不能在没调用 next() 时调用 remove(),否则抛 IllegalStateException。
- ✅ 正确:获取元素 → 判断 → 删除(紧跟在 next() 后)
- ❌ 错误:连续 remove();或 next() 前就 remove();或在 while 循环外 remove()
常见使用场景示例
比如清理空字符串:
List<string> list = new ArrayList(Arrays.asList("a", "", "b", null, "c"));
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s == null || s.trim().isEmpty()) {
it.remove(); // ✅ 安全删除
}
}</string></string>
注意:it.remove() 删除的是上一次 it.next() 返回的元素,不是当前判断的“下一个”元素。
替代方案:removeIf()(Java 8+)
如果只是条件删除,推荐更简洁安全的 Collection.removeIf():
list.removeIf(s -> s == null || s.trim().isEmpty());
它底层仍用迭代器实现,但封装了细节,不易出错,且语义清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











