pour chaque boucle vs iterator: efficacité dans la collection Traversal
introduction
Lorsque vous traversez une collection dans Java, le choix entre entre un pour une boucle pour la recherche et un itèreur. Cet article explore les différences d'efficacité entre ces deux approches.
Loop For-Eenh
introduit dans Java 5, la boucle forte (également connue sous le nom de Loop Enhanced) est une syntaxe concise et facile à lire pour iterner les collections. Il utilise l'itérateur en interne:
Lista = new ArrayList(); for (Integer integer : a) { integer.toString(); }
iterator
Un iterator fournit une interface standardisée pour itérer les collections. Il permet un contrôle personnalisé sur le processus de traversée.
Lista = new ArrayList(); for (Iterator iterator = a.iterator(); iterator.hasNext();) { Integer integer = iterator.next(); integer.toString(); }
Comparaison d'efficacité
Pour un accès simple en lecture seule à une collection, il n'y a pratiquement aucune différence de performance entre la boucle for-outi et l'approche itérateur. La boucle for-out utilise en interne le mécanisme d'Iterator.
Cependant, si vous utilisez la boucle traditionnelle "C-style" avec get (i):
for (int i = 0; iL'approche d'Iterator (à la fois en boucle For-Eense et en itérateur explicite) peut être beaucoup plus efficace pour certaines structures de données. Par exemple, dans une liste liée, GET (i) est une opération O (n). L'utilisation d'un iterator O (1) Next () s'assure que la boucle fonctionne en o (n) temps, tandis que le temps get (i) fonctionnerait en o (n 2 ). ByteCode pour les deux approches:
For-Enach Loop
list
a = new ArrayList (); pour (entier entier: a) { Integer.toString (); } aload 1 InvokeInterface java / util / list.iterator () ljava / util / iterator; Astore 3 ...
iteratorLista = new ArrayList(); for (Integer integer : a) { integer.toString(); } ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 3 ...aload 1 InvokeInterface java / util / list.iterator () ljava / util / iterator; Astore 2 ... Comme vous pouvez l'observer, le bytecode généré est identique, n'indiquant aucune pénalité de performance dans l'utilisation de l'une ou l'autre approche.
ListConclusiona = new ArrayList(); for (Integer integer : a) { integer.toString(); } Lista = new ArrayList(); for (Integer integer : a) { integer.toString(); } En résumé, lorsque la traversée d'une collection pour le minimum. L'itérateur n'offre des avantages que lorsque vous travaillez avec des structures de données spécifiques ou nécessitant un comportement d'itération personnalisé. Pour plus de simplicité et de lisibilité, la boucle for-out est généralement le choix préféré.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3