开发者

Does Java's for-each call an embedded method (that returns the collection) for every iteration?

开发者 https://www.devze.com 2023-01-08 18:19 出处:网络
I开发者_开发问答f there is a method call MyClass.returnArray() and I iterate over the array using the for-each construct (also called the \"enhanced for\" loop):

I开发者_开发问答f there is a method call MyClass.returnArray() and I iterate over the array using the for-each construct (also called the "enhanced for" loop):

for (ArrayElement e : MyClass.returnArray()) {
   //do something
}

will then the returnArray() method be called for every iteration?


No, it won't. The result of the first call will be stored in the compiled code in a temporary variable.

From Effective Java 2nd. Ed., Item 46:

Note that there is no performance penalty for using the for-each loop, even for arrays. In fact, it may offer a slight performance advantage over an ordinary for loop in some circumstances, as it computes the limit of the array index only once.


From the java language spec:

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement

and later on:

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

This is (in pseudo code) the equivalent of the advanced for loop for arrays. And it is made clear, that the Expression is evaluated once and the resulting array is assigned to T[] a.

So it's perfectly safe to use even complex expressions in the advanced for loop statement.


No.

The for loop is just syntactic sugar. It behaves differently depending on whether or not it is applied to an Array argument or an object implementing the Iterable interface.

For Iterable objects, the loop expands to something like this:

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

What your example code is actually doing is something like this:

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


No, it will be called once. It's not like the termination condition of a standard for loop, which gets evaluated on every iteration.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号