是否为java调用方法中的每个循环执行高级操作,该方法返回一个数组以便每次迭代?

d56*_*d56 31 java foreach

他,

我对java中的高级for循环有疑问.如果有一个方法调用Method.returnArray(),我用for(ArrayElement e:Method.returnArray())迭代数组{// do smth}

每次迭代都会调用.returnArray()吗?

谢谢.

Pét*_*rök 40

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

来自Effective Java 2nd.埃德.,第46项:

请注意,即使对于数组,使用for-each循环也不会有性能损失.实际上,在某些情况下,它可能比普通的for循环提供轻微的性能优势,因为它只计算一次数组索引的限制.


And*_*s_D 11

java语言规范:

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement
Run Code Online (Sandbox Code Playgroud)

后来:

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}
Run Code Online (Sandbox Code Playgroud)

这是(伪代码)等效于数组的高级for循环.并且清楚地表明,对Expression进行一次计算并将结果数组赋值给T[] a.

因此,在高级for循环语句中使用复杂的表达式是完全安全的.


Luc*_*cas 5

没有。

for循环只是语法糖。根据它是否应用于Array参数或实现Iterable接口的对象,其行为有所不同。

对于Iterable对象,循环扩展为如下所示:

Iterator<ArrayElement> iter = iterableObject.iterator();
while (iter.hasNext()) {
   ArrayElement e = iter.next();
   // do smth
}
Run Code Online (Sandbox Code Playgroud)

您的示例代码实际上在做什么,就像这样:

Object[] temp = Method.returnArray();
for ( int i = 0; i < temp.length; i++ ) {
  ArrayElement e = (ArrayElement) temp[i];
  // do smth
}     
Run Code Online (Sandbox Code Playgroud)

  • 这对于所有Iterable的子类都是完全正确的,但是高级的for循环也可以与数组一起使用,我想这就是问题的关键。它仍然是“语法糖”,但有所不同。 (2认同)