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?

24
demandé sur bernie2436 2011-05-02 00:07:46

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.

33
répondu MJB 2014-03-23 08:48:53

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.

3
répondu Greg Hewgill 2011-05-01 20:09:57

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.

2
répondu Joost 2011-05-01 20:17:41

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

2
répondu Brian Roach 2011-05-01 20:23:26

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.

1
répondu Peter Lawrey 2011-05-01 20:15:01

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.

1
répondu wespiserA 2011-05-01 20:15:11

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.

1
répondu Zach 2011-05-01 20:18:22

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.

1
répondu Steve Kuo 2011-05-02 01:52:46