Java中安全遍历并删除集合元素必须调用Iterator的remove()方法,不可用集合的remove()或for-each/普通for循环,否则触发fail-fast机制抛ConcurrentModificationException;正确做法是next()后立即remove(),且每next()最多调一次remove();Java 8+推荐使用removeIf()替代。

Java 中使用 Iterator 安全遍历并删除集合元素,核心是**必须调用迭代器自身的 remove() 方法**,绝不能直接调用集合的 remove()(如 list.remove() 或 set.remove()),否则会抛出 ConcurrentModificationException。
为什么不能用 for-each 或普通 for 循环边遍历边删?
for-each 本质是基于 Iterator 实现的,但隐藏了迭代器对象,无法调用 remove();普通 for 循环用下标操作(如 list.remove(i))会改变后续元素位置,导致漏删或越界。二者在修改集合结构的同时继续遍历,都会触发快速失败(fail-fast)机制。
正确做法:用 Iterator 的 remove() 删除当前项
必须先调用 next() 获取元素,再调用 remove() 删除它——且 remove() 每次只能删一次,不能连续调两次,否则抛 IllegalStateException。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 示例(删除所有偶数):
List<integer> list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5, 6));
Iterator<integer> it = list.iterator();
while (it.hasNext()) {
Integer num = it.next();
if (num % 2 == 0) {
it.remove(); // ✅ 安全删除
}
}
// 结果:[1, 3, 5]</integer></integer>
注意 remove() 的调用时机和限制
- 必须在调用
next()之后、且尚未再次调用next()前执行remove() - 一个
next()对应最多一次remove();重复调用会报错 -
remove()只能删除刚刚由next()返回的那个元素 - 不支持添加元素(
add()不在标准Iterator接口中)
替代方案:removeIf()(Java 8+,更简洁)
如果只是按条件批量删除,推荐使用集合自带的 removeIf() 方法,内部已做安全处理,代码更清晰:
list.removeIf(num -> num % 2 == 0); // ✅ 等效于上面的迭代器写法
该方法适用于 ArrayList、LinkedList、HashSet 等大多数集合,底层仍基于迭代器安全实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










