Java的" for each"循环如何工作?

时间:2020-03-05 18:59:22  来源:igfitidea点击:

考虑:

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

如果不对每种语法使用for,等效的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索引计数器,并检查array.length。请参阅Java语言规范。

回答

Java中的for-each循环使用基础的迭代器机制。因此与以下内容相同:

Iterator<String> iterator = someList.iterator();

while (iterator.hasNext()) {
  String item = iterator.next();
  System.out.println(item);
}

回答

这是一个等效的表达式。

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

回答

它看起来像这样。太硬了

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

Sun文档中每个都有很好的文字说明。

回答

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

回答

nsayer的答案暗示了这一点,但值得注意的是,当" someList"是实现java.lang.Iterable的任何内容时,OP的for(..)语法将起作用。 .util。因此,即使我们自己的类型也可以与此语法一起使用。

回答

另请注意,在原始问题中使用" foreach"方法确实存在一些局限性,例如在迭代过程中无法从列表中删除项目。

新的for循环更易于阅读,并且不需要单独的迭代器,但仅在只读迭代过程中才真正可用。

回答

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

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);
}

  
  Note that if you need to use
  i.remove(); in your loop, or access
  the actual iterator in some way, you
  cannot use the for( : ) idiom, since
  the actual Iterator is merely
  inferred.

[丹尼斯·布埃诺]

It's implied by nsayer's answer, but
  it's worth noting that the OP's for(..)
  syntax will work when "someList" is
  anything that implements
  java.lang.Iterable -- it doesn't have
  to be a list, or some collection from
  java.util. Even your own types,
  therefore, can be used with this
  syntax.

回答

Java" for-each"循环构造将允许在两种类型的对象上进行迭代:

  • T
  • java.lang.Iterable &lt;T>

Iterable <T>接口只有一种方法:Iterator <T> iterator()。这适用于" Collection <T>"类型的对象,因为" Collection <T>"接口扩展了" Iterable <T>"。