必须通过 iterator.remove() 删除元素,因集合的 remove() 会触发 fail-fast 机制导致 ConcurrentModificationException;iterator.remove() 同步更新状态,安全且仅限 next() 后调用一次。

Java 中使用 Iterator 在遍历时删除元素,**必须通过 iterator.remove() 方法**,不能直接调用集合的 remove()(如 list.remove()),否则会抛出 ConcurrentModificationException 异常。
为什么不能用集合自身的 remove()?
因为 Iterator 是“快速失败”(fail-fast)机制:当集合结构被外部修改(比如用 list.remove() 删除),而 Iterator 不知情时,下次调用 next() 或 hasNext() 就会检测到修改计数不一致,立即抛异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
正确做法:用 iterator.remove() 安全删除
该方法是 Iterator 接口定义的唯一允许在遍历中修改集合的方式,它会同步更新内部状态,避免异常。
- 必须在调用
next()之后、且只调用一次remove()(重复调用会抛IllegalStateException) - 不能在
hasNext()后直接remove()(还没取元素,无对象可删) - 适用于所有实现了
Iterable的集合(ArrayList、LinkedList、HashSet等)
示例:删除字符串列表中所有 "abc"
List<String> list = new ArrayList<>(Arrays.asList("a", "abc", "b", "abc", "c"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("abc".equals(s)) {
it.remove(); // ✅ 正确:安全删除当前元素
}
}
// 结果:["a", "b", "c"]
替代方案(按场景选择)
-
删除满足条件的多个元素:推荐用
Collection.removeIf()(Java 8+),更简洁:list.removeIf("abc"::equals) -
需要索引或反向遍历:可用普通 for 循环,但要倒序删(避免索引偏移),例如:
for (int i = list.size()-1; i >= 0; i--) { if ("abc".equals(list.get(i))) list.remove(i); } -
并发环境:考虑用线程安全集合(如
CopyOnWriteArrayList),其迭代器支持“弱一致性”,允许遍历时修改,但注意语义不同(迭代器看不到后续添加/删除)

















