Maison > Java > javaDidacticiel > 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
Libérer: 2024-11-17 11:54:02
original
526 Les gens l'ont consulté

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);
}
Copier après la connexion

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();
}
Copier après la connexion

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();
}
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal