不能边遍历边用集合的remove()方法,因为Java集合迭代器采用fail-fast机制,通过modCount检测并发修改;正确做法是仅使用Iterator.remove()。
为什么不能边遍历边用集合的remove()方法
直接调用 ArrayList.remove() 或 HashSet.remove() 在增强 for 循环或手动 while 遍历时会抛出 ConcurrentModificationException。这是因为 Java 集合的迭代器默认是“快速失败”(fail-fast)机制,底层通过 modCount 检查结构是否被意外修改。
正确做法是只通过 Iterator.remove() 删除当前元素——它会同步更新 modCount,避免异常。
- 错误写法:
for (String s : list) { if (s.isEmpty()) list.remove(s); } - 正确写法:
Iterator it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.isEmpty()) it.remove(); // ✅ 唯一安全的删除方式
}
Iterator与ListIterator的区别在哪
Iterator 是单向遍历接口,只能从头到尾调用 next();ListIterator 是它的子接口,仅适用于 List 实现类(如 ArrayList、LinkedList),支持双向移动和元素替换/插入。
常见误用是试图对 Set 或 Map.keySet() 调用 listIterator(),会抛出 UnsupportedOperationException。
立即学习“Java免费学习笔记(深入)”;