在增强的for循环一个java,是安全的假设被环绕在将只计算一次表达?(In a java enha

2019-08-31 23:58发布

在Java中,for-each循环。
如果我有生成的阵列的方法,称为genArray()

在下面的代码,将所述阵列中的每个时间通过调用重新生成genArray() 或将Java调用一次的方法和存储来自阵列副本?

for (String s : genArray())
{
    //...
}

谢谢

Answer 1:

关于增强的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 } 

其中ai是编译器生成的标识符可从任何其他标识符(生成编译器或其它方式)不同的是在范围上的点处for语句发生增强。

所以你的情况, genArray()不返回的亚型Iterable但数组类型,所以你增强for语句等效于以下几个基本for语句:

String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
    String s = a[i];
    // ...
}

genArray()将因此被称为只有一次(但目前公认的答案是部分错误的)。



Answer 2:

Java将调用一次genArray(),获得iterator对象,并调用多次。



Answer 3:

它应该只习惯于一次 - 这是与调用此:

  String[] strings = genArray();
  for (String s : strings) {
  ...


文章来源: In a java enhanced for loop, is it safe to assume the expression to be looped over will be evaluated only once?