Maison >Java >javaDidacticiel >Existe-t-il une différence de performances entre l'utilisation d'une boucle For-Each et d'un itérateur pour le parcours de collection en Java ?

Existe-t-il une différence de performances entre l'utilisation d'une boucle For-Each et d'un itérateur pour le parcours de collection en Java ?

DDD
DDDoriginal
2024-11-14 22:14:02905parcourir

Is There a Performance Difference Between Using a For-Each Loop and an Iterator for Collection Traversal in Java?

Pour chaque boucle par rapport à l'itérateur : efficacité du parcours de collection

Introduction

Lors du parcours une collection en Java, le choix se pose entre l'utilisation d'une boucle for-each et d'un itérateur. Cet article explore les différences d'efficacité entre ces deux approches.

Boucle For-Each

Introduite dans Java 5, la boucle for-each (également connue sous le nom de boucle for améliorée loop) est une syntaxe concise et facile à lire pour parcourir les collections. Il utilise l'itérateur en interne :

List<Integer> a = new ArrayList<>();
for (Integer integer : a) {
  integer.toString();
}

Itérateur

Un itérateur fournit une interface standardisée pour itérer sur les collections. Il permet un contrôle personnalisé sur le processus de traversée.

List<Integer> a = new ArrayList<>();
for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) {
   Integer integer = iterator.next();
   integer.toString();
}

Comparaison d'efficacité

Pour un simple accès en lecture seule à une collection, il n'y a pratiquement aucune différence de performances entre le boucle for-each et approche itératrice. La boucle for-each utilise en interne le mécanisme itérateur.

Cependant, si vous utilisez la boucle traditionnelle « style C » avec get(i) :

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

L'approche itérateur (à la fois pour -chaque boucle et itérateur explicite) peut être nettement plus efficace pour certaines structures de données. Par exemple, dans une liste chaînée, get(i) est une opération O(n). L'utilisation de l'opération O(1) next() d'un itérateur garantit que la boucle s'exécute en temps O(n), alors que la boucle get(i) s'exécuterait en temps O(n2).

Comparaison du bytecode

Pour confirmer que la boucle for-each utilise le mécanisme d'itération, nous pouvons comparer le bytecode généré pour les deux approches :

For-Each Boucle

List<Integer> a = new ArrayList<>();
for (Integer integer : a) {
  integer.toString();
}
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
...

Itérateur

List<Integer> a = new ArrayList<>();
for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) {
  Integer integer = iterator.next();
  integer.toString();
}
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
...

Comme vous pouvez l'observer, le bytecode généré est identique, indiquant aucune pénalité de performances en utilisant l'une ou l'autre approche.

Conclusion

En résumé, lors de la traversée d'une collection pour un accès en lecture seule, la différence entre une boucle for-each et un itérateur est minime . L'itérateur n'offre des avantages que lorsque l'on travaille avec des structures de données spécifiques ou lorsqu'il nécessite un comportement d'itération personnalisé. Pour des raisons de simplicité et de lisibilité, la boucle for-each est généralement le choix préféré.

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