Java中Iterator无内置索引,需用外部int变量计数;for-each循环同理;List可用ListIterator的nextIndex()获取已处理数量。

在 Java 中使用 Iterator 遍历时,它本身不提供“当前索引”或“已处理数量”的内置属性,但你可以通过外部变量轻松实现计数。
用普通 int 变量手动计数
这是最直接、最常用的方式:在循环外定义一个 int count = 0,每次调用 next() 后递增它。
- 适用于所有 Iterator 场景(包括 List、Set、自定义集合)
- 代码清晰,无额外开销
- 注意:count 表示的是“已取出来的元素个数”,不是下标(除非是 List 迭代)
示例:
Iterator<String> it = list.iterator();
int processed = 0;
while (it.hasNext()) {
String item = it.next();
System.out.println("第 " + (++processed) + " 个: " + item);
// 处理 item...
}
结合 for-each 循环时如何计数
for-each 语法底层仍用 Iterator,但它隐藏了迭代器对象,所以不能直接访问。若坚持用 for-each,仍需外部计数器:
立即学习“Java免费学习笔记(深入)”;
- 声明 int i = 0 在循环前
- 每次循环体中执行 i++ 或 ++i
- 注意:不能在增强 for 中用
it.next(),否则会抛异常
示例:
int index = 0;
for (String item : list) {
System.out.println("索引 " + index + ": " + item);
index++;
}
需要精确索引且是 List 时,优先考虑 ListIterator
如果原始集合是 List,且你既想用迭代器风格遍历,又需要知道当前位置(比如插入、反向遍历),推荐用 ListIterator:
- 支持
nextIndex()和previousIndex() -
nextIndex()返回下一个要返回元素的索引(即已处理数量) - 比手动计数更语义明确,尤其在做条件跳过或定位时更安全
示例:
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String item = lit.next();
int processedCount = lit.nextIndex(); // 已处理数量 = 当前位置索引
System.out.println("已处理 " + processedCount + " 个: " + item);
}
避免常见误区
以下做法容易出错,不建议:
- 在
hasNext()调用后、next()前就 ++count —— 此时还没真正取元素,计数会超前 - 把 count 放在 while 条件里自增(如
while (it.hasNext() && ++count > 0))—— 逻辑混乱,可读性差,且可能跳过第一个元素 - 误以为
Iterator的实现类(如 ArrayList$Itr)有 public 的 index 字段 —— 它是私有的,不可靠,也不跨 JDK 版本


















