pourquoi y a-t-il deux types différents de boucles for en java?
J'ai une boucle for, et je ne suis pas sûr de comment cela fonctionne. Je suis familier avec:
for(int i = 0; i <= 9; i++)
{
/* implementation */
}
Je suis confus au sujet d'une boucle for Sous la forme suivante:
String[] myString = new String[] {"one", "two", "three", "some other stuff"};
String str1 = "", str2 = "";
for (String s : myString)
{
/* implementation */
}
Comment fonctionnent ces types de boucles for
? que font-ils différemment des boucles for
régulières?
8 réponses
Le premier est l'original pour la boucle. Vous initialisez une variable, définissez une condition de fin et fournissez un compteur d'incrémentation / décrémentation d'état (il y a des exceptions, mais c'est le classique)
Pour cela,
for (int i=0;i<myString.length;i++) {
System.out.println(myString[i]);
}
Est correct.
Pour Java 5, une alternative a été proposée. Toute chose qui implémente iterable peut être prise en charge. C'est particulièrement agréable dans les Collections. Par exemple, vous pouvez itérer la liste comme ceci
List<String> list = ....load up with stuff
for (String string : list) {
System.out.println(string);
}
Au Lieu de
for (int i=0; i<list.size();i++) {
System.out.println(list.get(i));
}
Donc c'est juste une autre notation vraiment. Tout élément qui implémente Iterable (c'est-à-dire peut renvoyer un itérateur) peut être écrit de cette façon.
Ce qui se passe dans les coulisses est quelque chose comme ceci: (plus efficace, mais je l'écris explicitement)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string=it.next();
System.out.println(string);
}
En fin de compte c'est juste du sucre syntaxique, mais plutôt pratique.
Il y a un excellent résumé de cette fonctionnalité dans l'article la boucle For-Each . Il montre par exemple comment l'utilisation du style for-each peut produire un code plus clair et plus facile à lire et à écrire.
En utilisant la première for
-boucle, vous énumérez manuellement à travers le tableau en augmentant un index à la longueur du tableau, puis en obtenant manuellement la valeur à l'index actuel.
Cette dernière syntaxe est ajoutée en Java 5 et énumère un tableau en utilisant une instance Iterator
sous les hottes. Vous n'avez alors accès qu'à l'objet (pas à l'index) et vous ne pourrez pas ajuster le tableau lors de l'énumération.
C'est pratique lorsque vous souhaitez effectuer des actions sur tous les objets dans un tableau.
La boucle for-each a été introduite dans Java 1.5 et est utilisée avec des collections (et pour être pédante, des tableaux, et tout ce qui implémente l'interface Iterable<E>
... l'article note):
Http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html
La nouvelle boucle for-each
n'est qu'une main courte pour l'ancienne boucle. La nouvelle boucle est plus facile à utiliser pour les tableaux et certains itérateurs, mais pas aussi flexible, donc l'ancienne boucle doit être utilisée dans certaines situations, comme compter de 0 à 9.
La seconde boucle for Est un moyen facile d'itérer sur le contenu d'un tableau, sans avoir à spécifier manuellement le nombre d'éléments dans le tableau(énumération manuelle). C'est beaucoup plus pratique que le premier lorsqu'il s'agit de tableaux.
La boucle For-each, comme on l'appelle, est un type de boucle for qui est utilisé avec les collections pour garantir que tous les éléments d'une collection sont itérés. Par exemple
for ( Object o : objects ) {
System.out.println(o.toString());
}
Appellera la méthode toString () sur chaque objet de la collection"objects". Une bonne chose à ce sujet est que vous ne pouvez pas obtenir une exception hors limites.
Quelque chose qu'aucune des autres réponses ne touche, c'est que votre première boucle est en train d'indexer la liste. Alors que la boucle for-each utilise un Iterator
. Certaines listes comme LinkedList
itéreront plus rapidement avec un Iterator
par rapport à get(i)
. C'est parce que l'itérateur de la liste de liens garde la trace du pointeur actuel. Alors que chaque get
dans votre for i=0 à 9 doit recalculer le décalage dans la liste liée. En général, il est préférable d'utiliser for-each ou un Iterator
car il utilisera l'itérateur Collection
, qui dans la théorie est optimisée pour le type de collection.