必须用iterator的hasnext()和next()搭配remove()安全删除元素,因for-each隐式使用iterator但禁用remove,普通for循环删除会导致跳过元素或越界;核心三步:调iterator()获取实例、while中用hasnext()控制循环、每次只调一次next()后按需remove()。

获取集合的迭代器并安全遍历,关键在于三步到位:调用 iterator()、用 hasNext() 控制循环、每次只调一次 next()。只要不绕过迭代器直接操作集合,就能避开 ConcurrentModificationException。
怎么获取 Iterator 实例
所有实现 Iterable 接口的集合(如 ArrayList、HashSet、LinkedList)都提供 iterator() 方法:
- 返回值类型是
Iterator<e></e>,不是集合本身,也不是数组 - 它是“一次性”的:一旦遍历结束或抛异常,就不能重用,必须重新调用
iterator()获取新实例 - 示例:
Iterator<string> it = list.iterator();</string>或Iterator<integer> it = set.iterator();</integer>
怎么安全遍历(不越界、不跳元素)
最稳妥的写法是 while 循环配合 hasNext() 和 next(),且每轮只调一次 next():
-
hasNext()必须放在 while 条件里,不能只判断一次就硬取 -
next()每次只调一次,否则会跳过下一个元素(比如连续两次it.next(),第二次取的是第三个元素) - 空集合也能正常处理:
hasNext()返回false,循环直接跳过,不会触发NoSuchElementException
怎么在遍历时安全检查并删除元素
需要修改集合时,唯一安全的方式是使用 it.remove(),且必须满足两个前提:
- 只能在刚调完
next()后立即调用,不能提前,也不能重复调 - 它删的是上一次
next()返回的那个元素,和当前判断逻辑强绑定 - 错误示范:
it.remove()放在next()前 →IllegalStateException;循环里多次next()后再remove()→ 删错元素或异常
哪些写法看着方便但其实危险
增强 for 循环(for (E e : collection))本质就是自动展开成 Iterator,但它隐藏了迭代器对象,带来限制:
- 无法在循环体内调用
remove()—— 一旦写collection.remove(e),运行时必抛ConcurrentModificationException - 无法获取当前索引位置,也不能预读下一个元素
- 如果逻辑涉及条件删除,必须退回显式 Iterator 写法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











