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
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".
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>)
.
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é.
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.