Java foreach迭代顺序是否精确定义了基元?

示例代码:

int a[] = new int[]{0, 1, 2, 3}; int result = 0; for (int i : a) result += i; 

循环是否保证按顺序迭代a[0]a[1]a[2]a[3] ? 我坚信答案是肯定的,但这个页面似乎并没有明确说明秩序。

有一个坚实的参考?

根据JLS,增强的for语句 ,你的for循环相当于

 int[] array = a; for (int index = 0; index < a.length; index++) { int i = array[index]; result += i; } 

“其中arrayindex是编译器生成的标识符,它们与增强的for语句出现的范围内的任何其他标识符(编译器生成的或其他标识符)不同。” (稍微解释变量名称)。

是的:订单绝对保证。

请参阅Java语言规范第3版的第14.14.2节 。

如果Expression的类型是Iterable的子类型,那么让我成为表达式Expression.iterator()的类型。 增强的for语句相当于表单的基本for语句:

 for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement } 

其中#i是编译器生成的标识符,它与增强的for语句发生时的范围(第6.3节)中的任何其他标识符(编译器生成的或其他标识符)不同。

它在JLS中指出:

 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 } 

我没有在您引用的页面中找到任何暗示无序迭代的内容。 你能发布具体的报价吗?

无论如何,我发现这段代码:

 public static void main( String args[] ) { double a[] = new double[] { 0, 1, 2, 3 }; int result = 0; for ( double i : a ) { result += i; } 

反编译为旧式循环:

  public static void main(String args[]) { double a[] = { 0.0D, 1.0D, 2D, 3D }; int result = 0; double ad[]; int k = (ad = a).length; for(int j = 0; j < k; j++) { double i = ad[j]; result = (int)((double)result + i); } } 

当然,这与保证不同,但至少在arrays上的乱序迭代会非常奇怪,并且似乎违背了明显的常识实现。