每个'循环'的Java如何工作?

考虑:

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

就相当于什么for循环看起来像不使用每个语法?


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对象,则内部代码将使用一个int index计数器并相反检查array.length 。 请参阅Java语言规范。


每个构造也适用于数组。 例如

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(:)成语,因为实际的Iterator只是被推断出来的。

[丹尼斯布埃诺]

它的含义是nsayer的答案,但值得注意的是,当“someList”是实现java.lang.Iterable的任何东西时,OP的for(..)语法都可以工作 - 它不一定是列表或者某个集合java.util中。 因此,即使您自己的类型也可以使用该语法。


这是一个不承担Java迭代器知识的答案。 它不够精确,但对教育很有用。

编程时,我们经常编写如下所示的代码:

char[] grades = ....
for(int i = 0; i < grades.length; i++) {   // for i goes from 0 to grades.length
    System.out.print(grades[i]);           // Print grades[i]
}

foreach语法允许使用更自然,语法更少的嘈杂方式来编写此常见模式。

for(char grade : grades) {   // foreach grade in grades
    System.out.print(grade); // print that grade
}

此外,此语法对于不支持数组索引的对象(例如列表或集合)有效,但它们实现Java Iterable接口。

链接地址: http://www.djcxy.com/p/52983.html

上一篇: How does the Java 'for each' loop work?

下一篇: c# how to get last time in foreach statement?