In Java, using a for-each loop. I have a method that generates an array, called genArray()
.
In the following code, will the array be re-generated for each iteration by calling genArray()
? Or will Java call once the method and store a copy from the array?
for (String s : genArray())
{
//...
}
About the enhanced for statement, the Java Language Specifications writes:
The enhanced for statement has the form:
EnhancedForStatement: for ( VariableModifiersopt Type Identifier: Expression) Statement
The Expression must either have type
Iterable
or else it must be of an array type (§10.1), or a compile-time error occurs.The scope of a local variable declared in the FormalParameter part of an enhanced
for
statement (§14.14) is the contained StatementThe meaning of the enhanced
for
statement is given by translation into a basicfor
statement.If the type of
Expression
is a subtype ofIterable
, then letI
be the type of the expression Expression.iterator()
. The enhancedfor
statement is equivalent to a basicfor
statement of the form:for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
Where
#i
is a compiler-generated identifier that is distinct from any other identifiers (compiler-generated or otherwise) that are in scope (§6.3) at the point where the enhanced for statement occurs.Otherwise, the Expression necessarily has an array type,
T[]
. LetL1 ... Lm
be the (possibly empty) sequence of labels immediately preceding the enhancedfor
statement. Then the meaning of the enhanced for statement is given by the following basicfor
statement:T[] a = Expression; L1: L2: ... Lm: for (int i = 0; i < a.length; i++) { VariableModifiersopt Type Identifier = a[i]; Statement }
Where a and i are compiler-generated identifiers that are distinct from any other identifiers (compiler-generated or otherwise) that are in scope at the point where the enhanced for statement occurs.
So in your case, genArray()
doesn't return a subtype of Iterable
but an array type, so your enhanced for
statement is equivalent to the following basic for
statement:
String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
String s = a[i];
// ...
}
And genArray()
will thus be called only once (but the currently accepted answer is partially wrong).