java iterator 遍历模板方法的核心在于通过 iterator 接口提供的 hasnext() 和 next() 方法,在循环中安全地移除元素并避免 concurrentmodificationexception。具体做法是调用集合的 iterator() 获取实例,使用 while 循环判断是否有下一个元素,并在循环体内处理元素或调用 remove()。若需遍历后删除特定元素,必须依赖迭代器自身的 remove(),而非集合的 remove() 方法。

Iterator 接口的基本遍历流程是怎样的
Iterator 接口定义了三个核心方法:hasNext() 用于检查是否还有元素,next() 用于获取当前元素并移动到下一位,remove() 用于删除上次 next() 返回的元素。这种设计将遍历逻辑与集合内部结构解耦,使得遍历时可以安全地修改集合状态。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorBasicExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 获取迭代器
Iterator<String> it = list.iterator();
// 标准遍历模板
while (it.hasNext()) {
String item = it.next();
System.out.println("Current: " + item);
}
}
}
上述代码展示了最基础的遍历方式。首先创建了一个包含三个字符串的列表,然后调用 list.iterator() 获取迭代器实例。接着进入 while 循环,每次调用 hasNext() 检查是否还有未访问的元素。如果为真,则调用 next() 获取元素并打印。该过程不会修改原列表,仅进行读取操作。
立即学习“Java免费学习笔记(深入)”;
如何在遍历过程中安全地删除元素
在遍历过程中删除元素时,绝对不能直接使用集合的 remove() 方法,否则会导致 ConcurrentModificationException。正确的做法是在调用 next() 之后,立即调用迭代器的 remove() 方法。该方法会同步更新迭代器的内部状态和底层集合的结构,确保后续遍历的正确性。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorRemoveExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if ("B".equals(item)) {
it.remove(); // 安全删除
}
}
System.out.println(list); // 输出: [A, C]
}
}
此示例演示了如何在遍历中删除元素。当 item 等于 "B" 时,调用 it.remove() 从列表中移除该元素。注意,remove() 必须在 next() 之后调用,且只能调用一次,否则会抛出 IllegalStateException。执行完毕后,列表中的 "B" 被成功移除,剩余元素为 "A" 和 "C"。
如果忘记调用 next() 直接调用 remove() 会发生什么
如果在没有先调用 next() 的情况下直接调用 remove(),迭代器会抛出 IllegalStateException。这是因为 remove() 的设计依赖于上一次 next() 调用的返回值作为待删除对象。如果没有有效的上次元素,迭代器无法确定要删除哪个元素,因此强制要求必须先有 next() 调用。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorErrorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
Iterator<String> it = list.iterator();
try {
it.remove(); // 错误:未调用 next()
} catch (IllegalStateException e) {
System.out.println("Caught: " + e.getMessage());
}
}
}
运行上述代码将捕获到 IllegalStateException,提示 "No call to next()"。这验证了迭代器的状态机约束:只有在成功获取一个元素后,才能对该元素执行删除操作。开发者在使用时必须严格遵守这一顺序,以避免运行时异常。


















