Maison  >  Article  >  Java  >  Boucle For-Each ou itérateur : lequel est le plus efficace pour parcourir les collections ?

Boucle For-Each ou itérateur : lequel est le plus efficace pour parcourir les collections ?

DDD
DDDoriginal
2024-11-17 11:54:02403parcourir

For-Each Loop vs. Iterator: Which is More Efficient for Traversing Collections?

Détermination de l'efficacité : boucle For-Each vs itérateur

Lors du parcours efficace d'une collection, la question se pose : quelle approche est supérieure - une boucle for-each ou un itérateur ?

Traditionnel For Boucle

La boucle for traditionnelle, communément appelée boucle « style C », illustre la syntaxe suivante :

for(int i=0; i<list.size(); i++) {
   Object o = list.get(i);
}

Boucle For-Each

Java 5 a introduit la syntaxe de boucle for-each améliorée, qui rationalise le bouclage processus :

for (Integer integer : a) {
  integer.toString();
}

Itérateur

L'abstraction de l'itérateur de Java fournit un moyen alternatif de parcourir une collection :

for (Iterator iterator = a.iterator(); iterator.hasNext();) {
   Integer integer = (Integer) iterator.next();
   integer.toString();
}

Différences de performances

Pour une simple lecture des valeurs d'une collection sans modification, le choix entre un for-each boucle et un itérateur ne font aucune différence significative en termes de performances. Les deux approches utilisent l'itérateur en interne.

Cependant, la boucle for traditionnelle peut être moins efficace que la boucle for-each ou l'itérateur lors du parcours de structures de données particulières. Par exemple, les listes chaînées nécessitent une opération O(n) pour récupérer des éléments à l'aide de get(i). Cela se traduit par une complexité O(n2) pour la boucle. Les itérateurs garantissent une opération O(1) pour avancer, conduisant à une complexité O(n) pour la boucle.

Comparaison du bytecode

Comparaison du bytecode généré à partir des deux boucles types illustre leur équivalence :

Boucle For-Each Bytecode :

ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3

Bytecode de l'itérateur :

ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8

Conclusion

Depuis le for-each la boucle et l'itérateur fonctionnent essentiellement de la même manière en termes d'efficacité, c'est souvent une question de préférence. Pour la plupart des scénarios, la boucle for-each est esthétiquement préférée en raison de sa concision.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn