在Java中,for-each循环。
如果我有生成的阵列的方法,称为genArray()
在下面的代码,将所述阵列中的每个时间通过调用重新生成genArray()
或将Java调用一次的方法和存储来自阵列副本?
for (String s : genArray())
{
//...
}
谢谢
在Java中,for-each循环。
如果我有生成的阵列的方法,称为genArray()
在下面的代码,将所述阵列中的每个时间通过调用重新生成genArray()
或将Java调用一次的方法和存储来自阵列副本?
for (String s : genArray())
{
//...
}
谢谢
关于增强的for语句中,Java语言规范中写道:
增强的for语句的形式为:
EnhancedForStatement: for ( VariableModifiersopt Type Identifier: Expression) Statement
表达式必须具有类型
Iterable
否则它必须是一个数组类型(§10.1),或编译时发生错误。在的所述FormalParameter部分声明的局部变量的增强的范围
for
语句(§14.14)是包含声明该增强的含义
for
语句被翻译成给出一个基本for
语句。如果类型
Expression
是的子类型Iterable
,然后让I
是表达表达的类型。iterator()
增强for
说法是相当于基本for
形式的语句:for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
其中
#i
是一个编译器生成的标识符,从该点在哪里for语句出现增强在范围(§6.3)的任何其他标识符(生成编译器或其它)不同。否则,该表达式必须具有一个数组类型,
T[]
让L1 ... Lm
是紧接增强标签的(可能为空)序列for
语句。 然后,增强的for语句的含义是由下列基本给出for
声明:T[] a = Expression; L1: L2: ... Lm: for (int i = 0; i < a.length; i++) { VariableModifiersopt Type Identifier = a[i]; Statement }
其中a和i是编译器生成的标识符可从任何其他标识符(生成编译器或其它方式)不同的是在范围上的点处for语句发生增强。
所以你的情况, genArray()
不返回的亚型Iterable
但数组类型,所以你增强for
语句等效于以下几个基本for
语句:
String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
String s = a[i];
// ...
}
和genArray()
将因此被称为只有一次(但目前公认的答案是部分错误的)。
Java将调用一次genArray(),获得iterator对象,并调用多次。
它应该只习惯于一次 - 这是与调用此:
String[] strings = genArray();
for (String s : strings) {
...