si j'utilise une boucle for-each sur une liste liée en Java, est-il garanti que je vais itérer sur les éléments dans l'ordre dans lequel ils apparaissent dans la liste?
La liste chaînée est garantie pour agir dans un ordre séquentiel.
De la documentation
Une collection ordonnée (également appelée séquence ). L'utilisateur de cette interface a un contrôle précis sur où dans le liste chaque élément est inséré. Le l'utilisateur peut accéder aux éléments par leur index entier (position dans la liste), et rechercher des éléments dans la liste.
iterator () Renvoie un itérateur sur les éléments de cette liste dans l'ordre approprié.
J'ai trouvé 5 méthodes principales pour parcourir une liste chaînée en Java (y compris la méthode Java 8):
Pour la boucle
LinkedList<String> linkedList = new LinkedList<>();
System.out.println("==> For Loop Example.");
for (int i = 0; i < linkedList.size(); i++) {
System.out.println(linkedList.get(i));
}
Amélioré pour la boucle
for (String temp : linkedList) {
System.out.println(temp);
}
Boucle en boucle
int i = 0;
while (i < linkedList.size()) {
System.out.println(linkedList.get(i));
i++;
}
Itérateur
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
collection stream () util (Java 8)
linkedList.forEach((temp) -> {
System.out.println(temp);
});
Une chose à noter est que le temps d'exécution de For Loop ou While Loop est égal à O (n carré) car l'opération get(i)
prend O(n) fois ( voir ceci pour détails ). Les 3 autres méthodes prennent du temps linéaire et donnent de meilleurs résultats.
Comme le dit la définition de Linkedlist, il s’agit d’une séquence et vous êtes assuré d’obtenir les éléments dans l’ordre.
par exemple:
import Java.util.LinkedList;
public class ForEachDemonstrater {
public static void main(String args[]) {
LinkedList<Character> pl = new LinkedList<Character>();
pl.add('j');
pl.add('a');
pl.add('v');
pl.add('a');
for (char s : pl)
System.out.print(s+"->");
}
}
La liste chaînée garantit un ordre séquentiel.
Ne pas utiliser linkedList.get (i), en particulier à l’intérieur d’une boucle séquentielle, car elle empêche la création d’une liste chaînée et constitue un code inefficace.
Utilisation ListIterator
ListIterator<Object> iterator = wordTokensListJava.listIterator();
while( iterator.hasNext()) {
System.out.println(iterator.next());
}
Chaque implémentation Java.util.List est nécessaire pour conserver l’ordre. Vous devez donc utiliser ArrayList, LinkedList, Vector, etc. Chaque collection est ordonnée et chacun conserve l’ordre d’insertion (voir .Oracle.com/javase/1.4.2/docs/api/Java/util/List.html )