Pregunta ¿El bucle foreach de Java conserva el orden?


¿El ciclo foreach de Java comienza en el primer objeto y de forma lineal funciona hasta el final? Por ejemplo

String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
  //do stuff...
}

¿La cadena "Zoe" siempre se procesa primero, seguida de "Bob", etc.? No ocurre una clasificación? Lo he probado yo mismo y no he encontrado ninguno, pero necesito una garantía y no pude encontrar nada en los documentos.


33
2018-01-26 09:43


origen


Respuestas:


Sí. El orden no se cambia Esto se aplica a todos los tipos de colecciones del Java Collection Framework implementando el interfaz de iterador eso es usado por el for-loop. Si quieres ordenar tu Matriz, puedes usar Arrays.sort (nombres)


29
2018-01-26 09:44



El mejorado for loop se especifica en JLS 14.14.2, donde se escribe su código equivalente.

Se puede usar para recorrer arreglos e instancias de Iterable.

  • Para una matriz, el orden de iteración siempre se conservará y será coherente entre ejecuciones. Esto se debe a que es equivalente a un simple for ciclo con un índice que va desde el comienzo de la matriz hasta su final.

    El enunciado mejorado para es equivalente a una declaración básica para el formulario:

    T[] #a = Expression;
    L1: L2: ... Lm:
    for (int #i = 0; #i < #a.length; #i++) {
        {VariableModifier} TargetType Identifier = #a[#i];
        Statement
    }
    

    #a y #i son identificadores generados automáticamente que son distintos de cualquier otro identificador (generado automáticamente o no) que están en el alcance en el punto donde ocurre la instrucción for forzada.

  • Por un Iterable, seguirá el orden del correspondiente Iterator (recuperado llamando Iterable.iterator()), que puede o no ser consistente entre carreras.

    El enunciado mejorado para es equivalente a una declaración básica para el formulario:

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

    #i es un identificador generado automáticamente que es distinto de cualquier otro identificador (generado automáticamente o no) que están dentro del alcance (§6.3) en el punto donde ocurre la declaración for forzada.

    Debe consultar el Javadoc de cada tipo para ver si un pedido es consistente o no. Por ejemplo, se especifica explícitamente que para List, el iterador retiene el orden:

    Devuelve un iterador sobre los elementos en esta lista en la secuencia correcta.

    Mientras se especifica explícitamente que para Set, el pedido no está especificado (a menos que se realice una garantía adicional):

    Los elementos se devuelven sin un orden en particular (a menos que este conjunto sea una instancia de alguna clase que proporcione una garantía).


27
2018-01-26 09:55