This question already has answers here:
In a java enhanced for loop, is it safe to assume the expression to be looped over will be evaluated only once?

(3个答案)



How does the Java 'for each' loop work?

(28个答案)


已关闭6年。




post解释了foreach循环直接对应于使用迭代器。如果我写了一个foreach循环,它真的会被Iterator转换成for吗?特别是给定的循环:
for(Integer i : createList()){
    System.out.println(i);
}

我能保证无论什么时候总是只调用createList()吗?是否改写为:
for(Iterator<Integer> i = createList().iterator(); i.hasNext(); ) {
    System.out.println(i.next());
}

在某种中间步骤中还是恰好产生与上述相同的字节码?

最佳答案

根据Oracle documentation,确实生成了代码,但是根据所使用对象的类型而有所不同。

如果使用数组,则foreach循环将转换为带索引的for循环:

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    VariableModifiersopt TargetType Identifier = #a[#i];
    Statement
    }

如果您有一个可迭代的对象,则会得到一个带有迭代器的循环,如下所示:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiersopt TargetType Identifier = (TargetType) #i.next();
    Statement
}

关于java - 是否用迭代器将foreach循环从字面上重写为for循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23291670/

10-12 00:43
查看更多