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

2022-08-31 03:54:38

考虑:

List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
    System.out.println(item);
}

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


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

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

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

此外,如果成语的右侧是一个而不是一个对象,则内部代码将使用int索引计数器并对其进行检查。请参阅 Java 语言规范for (:)arrayIterablearray.length


答案 2

每个构造对数组也有效。例如:

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的某个集合。因此,即使是您自己的类型也可以与此语法一起使用。