Java';对于每次调用,每个迭代都有一个嵌入式方法(返回集合)?

Java';对于每次调用,每个迭代都有一个嵌入式方法(返回集合)?,java,foreach,Java,Foreach,如果有一个方法调用MyClass.returnArray(),我使用for-each构造(也称为“enhanced for”循环)在数组上迭代: 然后是否会为每次迭代调用returnArray()方法?否,它将被调用一次。它不像标准for循环的终止条件,它在每次迭代中都会得到评估。不,它不会。第一次调用的结果将存储在编译代码中的临时变量中 从第46项开始: 请注意,使用此选项不会导致性能损失 对于每个循环,甚至对于阵列,都会使用。事实上,它可能会提供一点性能优势 在某些情况下,在普通for循环上

如果有一个方法调用MyClass.returnArray(),我使用for-each构造(也称为“enhanced for”循环)在数组上迭代:


然后是否会为每次迭代调用
returnArray()
方法?

否,它将被调用一次。它不像标准for循环的终止条件,它在每次迭代中都会得到评估。

不,它不会。第一次调用的结果将存储在编译代码中的临时变量中

从第46项开始:

请注意,使用此选项不会导致性能损失 对于每个循环,甚至对于阵列,都会使用。事实上,它可能会提供一点性能优势 在某些情况下,在普通for循环上,因为它计算 数组索引只有一次

没有

for循环只是语法上的糖。它的行为取决于它是否应用于数组参数或实现Iterable接口的对象

对于Iterable对象,循环将扩展为以下内容:

Iterator<ArrayElement> iter = iterableObject.iterator();
while (iter.hasNext()) {
   ArrayElement e = iter.next();
   // do smth
}
Object[] temp = Method.returnArray();
for ( int i = 0; i < temp.length; i++ ) {
  ArrayElement e = (ArrayElement) temp[i];
  // do smth
}     
Iterator iter=iterableObject.Iterator();
while(iter.hasNext()){
ArrayElement e=iter.next();
//做smth
}
您的示例代码实际上是这样做的:

Iterator<ArrayElement> iter = iterableObject.iterator();
while (iter.hasNext()) {
   ArrayElement e = iter.next();
   // do smth
}
Object[] temp = Method.returnArray();
for ( int i = 0; i < temp.length; i++ ) {
  ArrayElement e = (ArrayElement) temp[i];
  // do smth
}     
Object[]temp=Method.returnArray();
对于(int i=0;i
来自:

后来:

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}
T[]a=表达式;
L1:L2:。。。Lm:
for(int i=0;i
这(在伪代码中)相当于数组的高级for循环。很明显,表达式计算一次,结果数组被分配给
T[]a


因此,在advanced for loop语句中使用复杂表达式是完全安全的。

这对于
Iterable
的所有子类都是完全正确的,但是advanced for loop也可以用于数组,我想,这就是问题的关键所在。这仍然是“句法上的甜点”,但有点不同。如果你对否决票感到疑惑,我同意这个结论,但我认为你引用的部分并不能很好地解释为什么。它主要讨论数组索引,这是毫无疑问的,并且无法解释(更不用说证明)“表达式”中的
returnArray
方法只被调用一次。