java中遍历集合时不能直接调用collection.remove(),否则抛concurrentmodificationexception;应使用iterator.remove(),且必须在next()后调用且仅一次;也可用java 8的removeif()简化操作。

Java 中不能在遍历集合时直接用 Collection.remove() 删除元素,否则会抛出 ConcurrentModificationException。正确做法是使用 Iterator 的 remove() 方法,它专为“边遍历边删除”设计,且必须在调用 next() 之后、且仅调用一次。
用 Iterator + while 安全移除元素
核心步骤:获取迭代器 → while 判断是否有下一个 → 调用 next() 获取当前元素 → 根据条件决定是否调用 remove()。
示例:移除列表中所有长度小于 3 的字符串:
List<string> list = new ArrayList(Arrays.asList("a", "bb", "ccc", "dd", "eee"));
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next(); // 必须先调用 next() 才能 remove()
if (s.length()
</string></string>
常见错误及后果
- 在未调用
next()时调用remove()→ 抛出IllegalStateException - 连续两次调用
remove()(中间没调用next())→ 同样抛出IllegalStateException - 用 for-each 循环配合
list.remove()→ 触发ConcurrentModificationException - 用普通 for 循环从前往后删 → 元素索引偏移,导致漏删或越界
替代方案:removeIf(Java 8+)
如果只是过滤删除,推荐更简洁安全的 Collection.removeIf(),内部已封装了迭代器逻辑:
list.removeIf(s -> s.length()
它适用于大多数单条件过滤场景,底层仍基于 Iterator.remove(),无需手动管理迭代过程。
注意点与边界情况
-
Iterator.remove()只对当前next()返回的元素生效,不可用于跳过或回退 - 并发修改(如其他线程同时修改集合)仍可能引发异常;若需线程安全,考虑
CopyOnWriteArrayList或加锁 - 对
Map的entrySet()迭代时,同样只能用其Iterator.remove()删除整个键值对,不能单独删 key 或 value
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











