iterator.remove()是唯一安全的遍历中删除方式,因其同步更新modcount与expectedmodcount;必须先next()再remove(),且不可连续调用。
在 java 中,使用 iterator.remove() 是唯一安全的、在遍历集合时删除元素的方式。直接调用集合自身的 remove()(如 list.remove())或在增强 for 循环中删除,都会抛出 concurrentmodificationexception。
为什么只能用 Iterator.remove()?
Java 集合(如 ArrayList、LinkedList、HashSet)内部维护一个 modCount 计数器,记录结构修改次数。迭代器在创建时会记录初始值(expectedModCount)。每次调用 iterator.next() 时,会校验两者是否一致;若不一致(比如你手动调用了 list.remove()),就立即抛异常。
Iterator.remove() 是特例:它由迭代器自己执行删除,并同步更新 expectedModCount,从而保持一致性。
正确使用 Iterator.remove() 的步骤
核心原则:先 next(),再 remove();且 remove() 每次最多调用一次(不能连续调两次,否则抛 IllegalStateException)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 获取集合的迭代器:
Iterator<t> it = collection.iterator();</t>
- 用
while (it.hasNext()) 循环,每次先 <code>T item = it.next(); - 在循环体内判断业务条件,满足则调用
it.remove(); - 注意:不能在
remove()后再次调用next()前重复remove(),也不可在未调用next()时调用remove()
实际示例:删除字符串列表中长度大于 5 的元素
错误写法(增强 for 循环中 remove):
for (String s : list) {
if (s.length() > 5) list.remove(s); // ❌ ConcurrentModificationException
}
正确写法(使用 Iterator):
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.length() > 5) {
it.remove(); // ✅ 安全删除
}
}</string>
替代方案与注意事项
Java 8+ 提供了更简洁的替代方式,但本质仍依赖迭代器逻辑:
-
Collection.removeIf(Predicate):内部就是用迭代器实现的,语义清晰,推荐用于简单条件 -
list.removeIf(s -> s.length() > 5);✅ 等价于上面的迭代器写法 - 不要混用:避免一边用
removeIf(),一边又用iterator.remove(),容易逻辑混乱 - 线程安全场景:若集合被多线程访问,即使用了
Iterator.remove()也不保证线程安全;应改用CopyOnWriteArrayList或加锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










