Java中Iterator配合while循环需先调用hasNext()判断再调用next()获取元素,避免在条件中直接调用next();遍历时删除元素必须用it.remove(),且仅在next()后立即调用;增强for循环更简洁但不支持删除或索引操作。

Java 中 Iterator 配合 while 循环使用,核心是用 hasNext() 控制循环条件,用 next() 获取元素。不能直接在 while 条件里调用 next(),否则会跳过元素或抛出异常。
基本写法:先判断再取值
标准安全写法如下:
- 调用
iterator.hasNext()判断是否还有下一个元素 - 为
true时,再调用iterator.next()取出当前元素 - 避免在 while 括号内连写
it.next() != null—— 这既不安全(可能空指针),也不符合迭代器设计逻辑(next()是“前进并返回”,不是“检查”)
示例:
List<String> list = Arrays.asList("a", "b", "c");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next(); // ✅ 安全:每次只在确认有元素后才取
System.out.println(item);
}
配合 remove() 安全删除元素
在遍历中修改集合(如删除)必须用 Iterator.remove(),不能直接调用集合的 remove(),否则抛 ConcurrentModificationException。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只能在调用过
next()后立即调用remove() - 每调用一次
next()最多调用一次remove()
示例(删除所有长度为 1 的字符串):
List<String> list = new ArrayList<>(Arrays.asList("a", "bb", "c", "dd"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.length() == 1) {
it.remove(); // ✅ 正确删除方式
}
}
注意 hasNext() 和 next() 的耦合关系
hasNext() 不改变迭代器状态,next() 才真正推进指针。两者必须配对使用:
- 错误写法:
while (it.hasNext()) { it.next(); it.next(); }→ 第二个next()可能越界 - 正确做法:每个
next()都对应一次hasNext()判断(隐含在 while 条件中) - 如果需要“预览”下一个元素,需自行缓存,
Iterator本身不支持 peek
替代方案:for-each 更简洁(但功能受限)
如果只是遍历读取,推荐用增强 for 循环,它底层自动使用 Iterator,更简洁不易出错:
for (String item : list) {
System.out.println(item);
}
但它无法在遍历时安全删除元素,也不能获取当前索引或反向遍历。需要控制流程或修改集合时,while + Iterator 仍是必要选择。

















