他,
我对java中的高级for循环有疑问。如果有一个方法调用Method.returnArray(),我迭代数组 for(ArrayElement e:Method.returnArray()){ //做什么 }
每次迭代都会调用.returnArray()吗?
感谢。
答案 0 :(得分:38)
不,它不会。第一次调用的结果将存储在编译代码中的临时变量中。
来自Effective Java 2nd. Ed.,第46项:
请注意,使用时不会有性能损失 for-each循环,即使对于数组也是如此。实际上,它可能会提供轻微的性能优势 在某些情况下,通过普通的for循环,因为它计算的限制 数组索引只有一次。
答案 1 :(得分:10)
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循环!