Quels sont les avantages D'Enhanced for loop et Iterator en Java?

quelqu'un peut-il s'il vous plaît me préciser quels sont les avantages de Enhanced pour boucle et itérateurs en java +5 ?

23
demandé sur Pascal Thivent 2010-07-25 13:28:30

12 réponses

Les points forts et aussi les faiblesses sont assez bien résumée dans Stephen Colebourne (Joda-Time, JSR 310, etc) amélioré pour chaque contrôle d'itération de boucle proposition de l'étendre dans Java 7:

FEATURE SUMMARY:

étend la boucle Java 5 pour permettre l'accès au indice de boucle, si c'est la première ou la dernière itération, et de supprimer le élément courant.

AVANTAGE MAJEUR

le pour chaque boucle est presque certainement le plus nouveau caractéristique populaire de Java 5. Ça fonctionne parce qu'il augmente l'abstraction niveau - au lieu d'avoir à les exprimer les petits détails de la boucle autour d'une liste ou d'une matrice (avec un index ou iterator), le développeur simplement les États qu'ils veulent boucler et le la langue prend en charge le reste. Cependant, tout le bénéfice est perdu comme dès que le développeur a besoin d'accéder à l'indice ou de supprimer un l'élément.

le Java 5 original pour chaque travail a pris relativement conservateur sur un nombre de questions visant à aborder le 80% des cas. Toutefois, les boucles sont un forme commune dans le codage que l' 20% restants qui n'a pas été abordé représente un important corps de code.

Le processus de conversion de la boucle retour de l'index pour chaque être ou itérateur base est douloureux. C'est parce que l'ancienne boucle de style si niveau significativement plus bas,plus bavard et moins clair. Il est également douloureux comme la plupart des IDEs ne supporte pas ce genre de "dé-remaniement".

AVANTAGE MAJEUR:

un idiome codant commun est exprimé à une abstraction plus élevée qu'actuellement. Cette sida lisibilité et clarté.

...

pour résumer, la boucle enhanced for offre une syntaxe concise de haut niveau pour boucler une liste ou tableau qui améliore la clarté et la lisibilité. Cependant, il manque certaines parties: permettre d'accéder à la boucle d'index ou de supprimer un élément.

Voir aussi

21
répondu Pascal Thivent 2013-07-27 10:31:18

Pour moi, c'est clair, le principal avantage est la lisibilité.

for(Integer i : list){
   ....
}

est clairement mieux que quelque chose comme

for(int i=0; i < list.size(); ++i){
  ....
}
12
répondu sly7_7 2010-07-25 15:42:16

je pense que c'est assez bien résumé par la page de documentation introduisant ici.

Itération sur une collection est plus laid qu'il doit être

Tellement vrai..

l'itérateur n'est que du désordre. En outre, c'est une occasion pour l'erreur. La variable d'itérateur se produit trois fois dans chaque boucle: c'est deux chances de se tromper. Pour chaque construction se débarrasser de l'encombrement et de la possibilité pour erreur.

Exactement

Quand vous voyez le signe deux-points (:) lire "."La boucle ci-dessus se lit comme suit: "pour chaque masque de temps t en C." Comme vous pouvez le voir, le for-each construit se combine magnifiquement avec des génériques. Il préserve toute la sécurité de type, tout en enlevant le reste encombrement. Parce que vous n'avez pas à déclarer l'itérateur, vous n'avez pas à fournir un générique déclaration. (Le compilateur fait cela pour vous derrière votre dos, mais vous avez besoin pas de souci - vous avec elle.)

j'aimerais résumer plus, mais je pense que cette page n'presque parfaitement.

4
répondu Lee Jarvis 2014-04-23 18:31:20

vous pouvez itérer sur n'importe quelle collection qui est itérable et aussi des tableaux. Et la différence de performance n'est pas quelque chose qui devrait vous inquiéter.

Lisibilité est important.

Prefer this    
for (String s : listofStrings) 
    {
     ... 
    }

over

    for (Iterator<String> iter = listofStrings.iterator(); iter.hasNext(); )
    {
     String s = iter.next();
     ...
    }

notez que si vous devez supprimer des éléments lors de l'itération, vous devez utiliser Iterator.

Par exemple,

List<String> list = getMyListofStrings(); 

    for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) 
    {
        String s = iter.next();
        if (someCondition) {
            iter.remove(); 
        }
    }

Vous ne pouvez pas utiliser for(String s : myList) pour supprimer un élément dans la liste.

Notez également que lors de l'itération à travers un tableau foreach (ou amélioré) peut être utilisé uniquement pour obtenir les éléments, vous ne pouvez pas modifier les éléments dans le tableau.

Pour plus d'informations, voir .

3
répondu Zaki 2010-07-25 15:45:04

une syntaxe plus claire ! Il n'y a pas de différence du point de vue des performances que c'est juste une commodité pour un programmeur.

2
répondu Gopi 2010-07-25 09:36:56

comme d'autres l'ont dit, la boucle enhanced for fournit une syntaxe plus claire, un code lisible et moins de type.

de plus, il évite le scénario d'erreur possible "index out of bound". Par exemple, lorsque vous itérez une liste manuellement, vous pourriez utiliser la variable index d'une mauvaise manière, comme:

for(int i=0; i<= list.size(); i++)

qui fera exception. Mais en cas de boucle améliorée, nous laissons la tâche itérative au compilateur. Il évite complètement le cas d'erreur.

1
répondu Veera 2010-07-25 15:45:52

inconvénient Majeur est la création d'un Itérateur, qui n'est pas là, avec un indice de boucle. Il est généralement correct, mais dans les sections critiques pour la performance (dans une application en temps réel par exemple, quand elle doit tourner plusieurs centaines de fois par seconde), il peut causer une intervention majeure du GC...

1
répondu Gyscos 2011-01-01 16:10:16

comme d'autres répondent déjà, c'est un sucre de syntaxe pour nettoyeur. Si vous comparez à la boucle Iterator de classe, vous trouverez une variable de moins que vous devrez déclarer.

0
répondu Dennis C 2010-07-25 09:53:48

Un foreach/accrue/boucle for sert à fournir un curseur sur un objet de données. Ceci est particulièrement utile quand vous pensez en termes de "marche un fichier ligne par ligne" ou "marche d'un ensemble de résultats record en record" comme il est simple et facile à mettre en oeuvre.

cela fournit aussi une façon plus générale et améliorée d'itérer par rapport aux méthodes basées sur l'index parce qu'il n'y a plus besoin pour l'appelant (pour la boucle) de savoir comment les valeurs sont récupérées ou les tailles de collecte ou d'autres détails de mise en œuvre.

0
répondu user268396 2010-07-25 17:44:08

il est plus concis. Le seul problème est la vérification nulle.

for (String str : strs) {  // make sure strs is not null here
    // Do whatever
}
0
répondu fastcodejava 2010-07-25 21:03:51

moins de Dactylographie! Plus d'aide du compilateur

-2
répondu Thorbjørn Ravn Andersen 2010-07-25 15:38:45

le renforcement de La boucle for offre un avantage principal:

for (int i=0; i <= list.size(); i++)

il élimine le calcul répété de list.size() sur chaque itération de la version non améliorée ci-dessus. C'est un avantage de performance qui compte.

vous pouvez aussi calculer la taille à l'extérieur de la boucle comme suit en utilisant une variable supplémentaire:

int size = list.size();
for (int i=0; i <= size; i++)
-3
répondu Wilbur DSouza 2016-03-16 21:30:48