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

时间:2010-07-21 10:21:31

标签: java iterator for-loop

他,

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

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

感谢。

5 个答案:

答案 0 :(得分:38)

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

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

  

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

答案 1 :(得分:10)

来自java language spec

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement

以及后来:

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

这是(伪代码)相当于数组的高级for循环。并且清楚地表明,表达式被评估一次,结果数组被分配给T[] a

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

答案 2 :(得分:4)

没有

for循环只是语法糖。它的行为differently取决于它是否应用于Array参数或实现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
}     

答案 3 :(得分:2)

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

答案 4 :(得分:-1)

不,我不这么认为。从那以后,我会注意到它“生产”(表现不佳)。

所以,请继续使用foreach循环!