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;
}
“其中array
和index
是编译器生成的标识符可从任何其他标识符(编译器生成或以其它方式),其在范围在其中所述增强for
语句发生点是不同的。” (略微这里复述变量名称)。
所以,是:顺序绝对保证
其他提示
请参阅Java语言规范的部14.14.2 ,第3版。
如果表达式的类型是一个子类型 可迭代的,然后让我成为的类型 表达Expression.iterator()。 增强的for语句 等同于声明基本 的形式:
for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
其中#i的是所生成的编译器 标识符是从任何不同 其他标识符(编译器生成的 或以其它方式),其在范围(§6.3) 的点处的增强型 发生语句。
它在 吉林森 那:
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);
}
}
当然,这是不一样的保证,但至少是乱序遍历所有的数组会很奇怪,似乎违背明显的常识性的实现。
不隶属于 StackOverflow