Java中Iterator不能直接new,必须通过集合的iterator()方法获取,它是遍历状态对象而非工具;所有Iterable集合均提供该方法,返回泛型匹配的独立迭代器实例;标准用法为while+hasNext+next;遍历时删除须用iterator.remove();增强for循环本质是Iterator语法糖,但限制索引、删除和预判能力。

Java 中 Iterator 迭代器不能直接 new,必须通过集合对象的 iterator() 方法获取。它不是“遍历工具”,而是“遍历状态对象”——每次调用都生成一个独立、一次性、不可复位的新实例。
怎么获取迭代器
所有实现了 Iterable 接口的集合(如 ArrayList、HashSet、LinkedList、TreeSet 等)都提供 iterator() 方法:
- 返回类型是 Iterator<E>,泛型 E 与集合元素类型一致
- 底层返回的是具体集合内部实现的迭代器类(例如 ArrayList 返回的是其私有静态类 Itr)
- 即使对同一个集合反复调用 iterator(),每次得到的都是全新、互不影响的迭代器
标准使用方式:while + hasNext + next
这是最安全、最通用、最推荐的写法,适用于所有场景:
- hasNext() 只判断、不移动指针,必须在调用 next() 前检查
- next() 才真正移动指针并返回当前元素;每调用一次,只取一个元素
- 二者必须成对出现,漏掉 hasNext() 判断会导致 NoSuchElementException
示例:
立即学习“Java免费学习笔记(深入)”;
Iterator<String> it = list.iterator();while (it.hasNext()) {
String item = it.next(); // 每次只调用一次 next()
System.out.println(item);
}
边遍历边删除:只能用 iterator.remove()
在遍历过程中删除元素,绝不能调用集合自身的 remove()(如 list.remove()),否则触发 ConcurrentModificationException:
- iterator.remove() 是唯一安全的删除方式,且只能删除上一次 next() 返回的那个元素
- 每个 next() 后最多调用一次 remove(),重复调用会抛 IllegalStateException
- 未调用过 next() 就调用 remove(),也会报错
正确示例:
Iterator<Integer> it = numbers.iterator();while (it.hasNext()) {
int n = it.next();
if (n % 2 == 0) {
it.remove(); // 安全删除偶数
}
}
增强 for 循环的本质与限制
for-each(for (String s : list))在编译期自动转为等价的 Iterator 遍历代码,但屏蔽了底层控制权:
- 无法获取当前索引位置
- 无法在循环中调用 remove()(会抛异常)
- 无法提前预判下一个元素(比如跳过某些项或做条件 peek)
- 一旦需要精细操作(如安全删除、条件终止、多步判断),就必须显式使用 Iterator


















