Java中用Iterator替代传统索引遍历,核心是放弃for(int i=0; i<list.size(); i++)模式,改用while(it.hasNext())和it.next()安全遍历,避免并发修改异常且解耦遍历逻辑。

Java 中用 Iterator 替代传统索引遍历,核心是放弃用 for (int i = 0; i 这种基于下标的方式,转而用面向“元素存在性”和“移动动作”的方式安全、简洁地访问集合元素。
为什么 Iterator 更适合替代索引遍历
索引遍历在 List 上看似直观,但一旦换成 Set、Map 的 keySet/entrySet、Queue 等无序或不支持随机访问的集合,就完全失效;而 Iterator 是所有 Collection 子接口(包括 List、Set、Queue)统一提供的遍历契约,天然适配各种集合类型。更重要的是,它支持在遍历中安全删除元素——这是索引遍历配合 remove() 极易引发 ConcurrentModificationException 或漏删/越界的关键痛点。
基础写法:用 while + hasNext() + next()
这是最直接对应传统 for 循环逻辑的 Iterator 写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// 传统索引遍历
for (int i = 0; i < list.size(); i++) {<br>
String item = list.get(i);<br>
System.out.println(item);<br>
}
// 等效的 Iterator 写法
Iterator<String> it = list.iterator();<br>
while (it.hasNext()) {<br>
String item = it.next();<br>
System.out.println(item);<br>
}
增强 for 循环本质就是 Iterator
Java 的 for-each 循环(for (String s : list))在编译后自动展开为上述 Iterator 模式,语义更简洁,且同样支持所有实现了 Iterable 的集合:
立即学习“Java免费学习笔记(深入)”;
- 对 List、Set、Queue、数组都有效
- 底层调用
collection.iterator(),自动处理 hasNext/next - 不能直接在循环体中调用
collection.remove(),但可通过显式获取 Iterator 实现安全删除
// 安全删除示例(增强 for 不行,必须用显式 Iterator)
Iterator<String> it = list.iterator();<br>
while (it.hasNext()) {<br>
if ("target".equals(it.next())) {<br>
it.remove(); // 唯一安全的删除方式<br>
}<br>
}
注意边界与常见误区
-
不要多次调用 next():每次
next()都推进指针,重复调用会跳过元素 -
remove() 必须紧跟在 next() 之后,且只能调用一次;否则抛
IllegalStateException -
ListIterator 支持双向遍历和添加:若需反向或插入,可用
list.listIterator() - 并发修改仍需同步:Iterator 本身不解决多线程修改问题,外部同步或使用线程安全集合(如 CopyOnWriteArrayList)

















