考虑:

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

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


当前回答

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

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

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

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

其他回答

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

使用较旧的Java版本(包括Java7),可以使用foreach循环,如下所示。

List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");

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

以下是Java8中使用for-each循环的最新方法(使用forEach+lambda表达式或方法引用循环List)。

Lambda公司

// Output: A,B,C,D,E
items.forEach(item->System.out.println(item));

方法参考

// Output: A,B,C,D,E
items.forEach(System.out::println);

有关详细信息,请参阅“Java 8 For Each examples”。

Java“for each”循环构造将允许对两种类型的对象进行迭代:

T[](任何类型的数组)java.lang.Iterable<T>

Iterable<T>接口只有一个方法:Iterator<T>迭代器()。这对Collection<T>类型的对象有效,因为Collection<T<接口扩展了Iterable<T>。

它看起来像这样。非常粗糙。

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

Sun文档中对每一项都有很好的描述。

这是一个等价的表达式。

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