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!