Java中用Iterator实现单向链表安全遍历的核心是:自定义链表类实现Iterable接口,每次iterator()返回独立迭代器实例;内部Iterator通过modCount校验防止并发修改;遍历时须用迭代器remove()而非链表方法。

Java 中用 Iterator 实现单向链表的安全遍历,核心是自定义链表类并实现 Iterable 接口,让每次遍历都使用独立的、状态隔离的迭代器实例,从而避免并发修改异常(ConcurrentModificationException)和遍历时结构被意外破坏的问题。
1. 自定义单向链表并实现 Iterable
链表本身不直接提供迭代器,需手动实现。关键点是:链表类实现 Iterable<T>,并在 iterator() 方法中返回一个内部迭代器对象。
- 节点类(
Node)只需包含数据和next引用 - 链表类(如
SinglyLinkedList<T>)维护head,并实现Iterable<T> -
iterator()每次调用都新建一个迭代器实例,确保多个遍历互不干扰
2. 编写线程安全的内部 Iterator 类
内部迭代器应封装当前遍历位置(如 current 节点),并支持 hasNext() 和 next()。为提升安全性,可加入以下设计:
- 在构造时记录链表的“修改计数”(
modCount),每次增删操作递增该值 -
next()前校验当前modCount是否与迭代器创建时一致,不一致则抛出ConcurrentModificationException -
remove()方法应支持安全删除(仅删除上一次next()返回的元素),并同步更新计数
3. 遍历时禁止直接修改链表结构
即使有迭代器保护,仍需遵守使用规范:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 遍历中不要调用链表的
add()、remove()等结构性方法(应改用迭代器自身的remove()) - 若需边遍历边修改,优先考虑先收集待操作索引/元素,遍历结束后统一处理
- 多线程场景下,仅靠
modCount不足以保证线程安全;需额外加锁(如synchronized或使用java.util.concurrent工具)
4. 使用示例与注意事项
正确用法如下:
SinglyLinkedList<String> list = new SinglyLinkedList<>();
list.add("a"); list.add("b"); list.add("c");
// 安全遍历(每次 iterator() 返回新实例)
for (String s : list) {
System.out.println(s);
}
// 也可显式使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) it.remove(); // 安全删除
}
注意:不要在 for-each 循环中调用 list.remove(...),这会触发快速失败机制;也不要复用同一个迭代器多次遍历(它是一次性的)。

















