web-dev-qa-db-fra.com

Java Boucle pour chaque: ordre de tri

Est-ce qu'un Java pour chaque boucle garantit que les éléments seront présentés dans l'ordre s'ils sont invoqués dans une liste? Dans mes tests, cela semble, mais je n'arrive pas à trouver cela explicitement mentionné dans toute documentation

List<Integer> myList;// [1,2,3,4]
for (Integer i : myList) {
  System.out.println(i.intValue());
}

#output
1,2,3,4
47
Mike

Oui. La boucle foreach parcourt la liste dans l'ordre fourni par la méthode iterator(). Voir la documentation de l'interface Iterable .

Si vous regardez la Javadoc pour la liste vous pouvez voir qu'une liste est une "collection ordonnée" et que la méthode iterator() renvoie un itérateur qui itère "dans la séquence appropriée".

48
hallidave

La boucle foreach utilisera l'itérateur intégré dans le Collection, donc l'ordre dans lequel vous obtenez les résultats dépendra si le Collection maintient ou non un certain ordre dans les éléments.

Donc, si vous faites une boucle sur un ArrayList, vous obtiendrez les éléments dans l'ordre dans lequel ils ont été insérés (en supposant que vous n'avez pas continué à trier la liste de tableaux). Si vous faites une boucle sur un HashSet, tous les paris sont désactivés, car les HashSets ne maintiennent aucun ordre.

Si vous devez garantir un ordre aux éléments de la collection, définissez un Comparator qui établit cet ordre et utilisez Collections.sort(Collection<T>, Comparator<? super T>).

15
rjohnston

Oui, les spécifications de langage Java Java garantissent que

for (Iterator<Whatever> i = c.iterator(); i.hasNext(); )
    whatEver(i.next());

est équivalent à

for (Whatever x : c)
    whatEver(x);

aucun "changement de commande" n'est autorisé.

10
Alex Martelli

Vous pouvez utiliser une boucle for, une la for (int i = 0; i < myList.length(); i++) si vous voulez le faire de manière ordonnée. Cependant, pour autant que je sache, foreach devrait le faire dans l'ordre.

3
user153498