Java“for each”循环是如何工作的?

新手上路,请多包涵

考虑:

 List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList

 for (String item : someList) {
    System.out.println(item);
}

如果不使用 for each 语法,等效的 for 循环会是什么样子?

原文由 Jay R. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 621
2 个回答
for (Iterator<String> i = someIterable.iterator(); i.hasNext();) {
    String item = i.next();
    System.out.println(item);
}

请注意,如果您需要在循环中使用 i.remove(); ,或以某种方式访问实际的迭代器,则不能使用 for ( : ) 成语,因为实际的迭代器只是推断出来的。

正如 Denis Bueno 所指出的,此代码适用于实现 Iterable 接口 的任何对象。

此外,如果 for (:) 习语的右侧是 array 而不是 Iterable 对象,则索引使用内部代码检查 array.length 代替。请参阅 Java 语言规范

原文由 nsayer 发布,翻译遵循 CC BY-SA 3.0 许可协议

each 的构造也适用于数组。例如

String[] fruits = new String[] { "Orange", "Apple", "Pear", "Strawberry" };

for (String fruit : fruits) {
    // fruit is an element of the `fruits` array.
}

这基本上等同于

for (int i = 0; i < fruits.length; i++) {
    String fruit = fruits[i];
    // fruit is an element of the `fruits` array.
}

所以,总体总结:

[nsayer] 以下是正在发生的事情的较长形式:

 for(Iterator<String> i = someList.iterator(); i.hasNext(); ) {
  String item = i.next();
  System.out.println(item);
}

注意,如果需要使用 i.remove();在你的循环中,或者以某种方式访问实际的迭代器,你不能使用 for(:) 习惯用法,因为实际的迭代器只是被推断出来的。

[丹尼斯布埃诺]

nsayer 的回答暗示了这一点,但值得注意的是,当“someList”是实现 java.lang.Iterable 的任何东西时,OP 的 for(..) 语法将起作用——它不一定是列表,或者来自java.util.因此,即使您自己的类型也可以使用此语法。

原文由 Mikezx6r 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题