java中iterator通过hasnext()和next()安全遍历集合,避免concurrentmodificationexception;支持边遍历边用remove()删除元素;for-each本质是iterator实现但不支持手动remove。

Java 中 Iterator 迭代器通过 hasNext() 和 next() 配合,安全、标准地遍历集合元素,避免并发修改异常(ConcurrentModificationException),也支持边遍历边删除。
基本遍历写法(推荐 while 循环)
Iterator 是 Collection 接口定义的标准访问方式,所有实现类(如 ArrayList、HashSet)都支持:
- 先调用 collection.iterator() 获取迭代器对象
- 用 hasNext() 判断是否还有下一个元素(返回 boolean)
- 有则调用 next() 获取该元素(返回 Object 或泛型类型)
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
List<string> list = Arrays.asList("a", "b", "c");
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}
</string></string>
for-each 循环本质就是 Iterator
Java 的增强 for 循环(for-each)底层自动使用 Iterator 实现,语义更简洁,但功能等价:
- 写法: for (String s : list) { ... }
- 它隐式调用 iterator()、hasNext()、next(),不可手动控制迭代过程
- 不能在遍历时调用 remove() —— 因为没有暴露 Iterator 引用
遍历时安全删除元素(必须用 Iterator.remove())
直接调用集合的 remove() 方法会导致 ConcurrentModificationException;唯一安全的方式是使用迭代器自身的 remove() 方法:
- 必须在调用过 next() 后才能调用 remove()
- 每次 next() 最多对应一次 remove(),重复调用会抛 IllegalStateException
示例(删除所有长度为 1 的字符串):
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.length() == 1) {
it.remove(); // 安全删除
}
}
</string>
注意点和常见误区
- Iterator 不是线程安全的:多线程环境下需额外同步,或改用并发集合(如 CopyOnWriteArrayList)
- fail-fast 机制:多数集合的 Iterator 在检测到集合被外部修改时立即抛出 ConcurrentModificationException
- Iterator 只能单向遍历:ListIterator 才支持双向(previous())和增删改,但仅限 List
- 不要在循环中反复调用 collection.iterator(),每次都会新建一个迭代器,可能跳过元素或重复遍历
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










