必须调用iterator.remove()才能安全遍历删除,因直接调用集合remove()会触发concurrentmodificationexception;for-each无法调用remove(),普通for循环易索引错位;removeif()是java 8+推荐的简洁安全替代方案。

Java 集合中用 Iterator 安全遍历并删除元素,核心是**必须调用 iterator.remove(),绝不能直接调用集合的 remove() 方法**,否则会抛出 ConcurrentModificationException。
为什么不能用 for-each 或普通 for 循环删除?
for-each 循环底层使用的是迭代器,但隐藏了 Iterator 对象,无法调用 remove();普通 for 循环用索引删除会导致后续元素前移、索引错位,容易漏删或越界。例如:
for (String s : list) {
if ("abc".equals(s)) {
list.remove(s); // ❌ 触发 ConcurrentModificationException
}
}
正确做法:用 Iterator 的 remove() 方法
Iterator.remove() 是唯一被设计为在遍历时安全删除的方式,它会同步更新内部修改计数器,避免并发修改检查失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先获取
Iterator实例(调用collection.iterator()) - 用
hasNext()和next()遍历 - 在确认要删除时,立即调用
iterator.remove()(只能删刚返回的元素)
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("abc".equals(s)) {
it.remove(); // ✅ 安全删除
}
}</string>
注意 remove() 的调用限制
iterator.remove() 有严格使用规则:
- 必须在调用
next()之后才能调用,且每调用一次next()最多调用一次remove() - 不能连续调用两次
remove()(会抛IllegalStateException) - 不能在
next()前调用(尚未定位元素)
替代方案:removeIf()(Java 8+ 推荐)
如果只是按条件批量删除,Collection.removeIf(Predicate) 更简洁、安全,内部已封装迭代逻辑:
list.removeIf(s -> "abc".equals(s)); // ✅ 一行搞定,线程安全(单线程下)
该方法适用于大多数过滤删除场景,语义清晰,不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










