¿Está Java definido con precisión el orden de iteración de cada primitiva?
Pregunta
Código de ejemplo:
int a[] = new int[]{0, 1, 2, 3};
int result = 0;
for (int i : a)
result += i;
¿Se garantiza que el bucle se repetirá a través de a[0]
, a[1]
, a[2]
, a[3]
¿en ese orden?Creo firmemente que la respuesta es sí, pero esta página parece no indicar claramente el orden.
¿Tienes una referencia sólida?
Solución
De acuerdo a el JLS, el mejorado for
declaración, su bucle for es equivalente a
int[] array = a;
for (int index = 0; index < a.length; index++) {
int i = array[index];
result += i;
}
"dónde array
y index
son identificadores generados por el compilador que son distintos de cualquier otro identificador (generado por el compilador o de otro tipo) que esté dentro del alcance en el punto donde la versión mejorada for
ocurre la declaración." (parafraseando ligeramente los nombres de las variables aquí).
Entonces sí:El pedido está absolutamente garantizado.
Otros consejos
Consulte sección 14.14.2 de la Especificación del lenguaje Java , 3a edición .
Si el tipo de expresión es un subtipo de Iterable, entonces déjame ser el tipo de la expresión Expression.iterator (). La declaración for mejorada es equivalente a una declaración básica de el formulario:
for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
Donde #i es un compilador generado identificador que es distinto de cualquier otros identificadores (generados por el compilador o de lo contrario) que están dentro del alcance (& # 167; 6.3) en el punto donde el mejorado para declaración ocurre.
Indica en el JLS que:
for ( VariableModifiersopt Type Identifier: Expression) Statement
es equivalente a
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt Type Identifier = a[i];
Statement
}
No encontré nada en la página a la que haya hecho referencia que implique una iteración fuera de orden. ¿Puedes publicar la cotización específica?
En cualquier caso, encuentro que este código:
public static void main( String args[] ) {
double a[] = new double[] { 0, 1, 2, 3 };
int result = 0;
for ( double i : a ) {
result += i;
}
descompila al bucle de estilo antiguo:
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);
}
}
Por supuesto, eso no es lo mismo que una garantía, pero al menos la iteración fuera de orden sobre una matriz sería muy extraña y parecería ir en contra de la implementación obvia de sentido común.