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"循环构造将允许在两种类型的对象上进行迭代:
Iterable <T>接口只有一种方法:Iterator <T> iterator()。这适用于" Collection <T>"类型的对象,因为" Collection <T>"接口扩展了" Iterable <T>"。