Pour chaque vs Itérateur. Qui sera la meilleure option
Envisagez le scénario suivant.
List<String> list = new ArrayList<>();
Maintenant, j'ai ajouté le String
les valeurs de cette liste.
J'ai utilisé de la manière suivante pour aller à chaque élément de la liste.
Option d'une utilisation for-each
for (String i : list) {
System.out.println(i);
}
Option deux - utilisation Iterator
Iterator it=list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
Je veux juste savoir est-il un avantage de performance si j'utilise for-each
au lieu de Iterator
. Et aussi est-ce une mauvaise pratique à utiliser Itérateur maintenant un jours en Java?
- Je pense que pour chacun utilise l'itérateur
- possible en double stackoverflow.com/questions/2113216/...
Vous devez vous connecter pour publier un commentaire.
for-each
est sucre syntaxique pour l'utilisation deiterators
(approche 2).Vous pourriez avoir besoin d'utiliser
iterators
si vous avez besoin de modifier de collecte dans votre boucle. Première approche va jeter l'exception.La différence est en grande partie sucre syntaxique sauf qu'un Itérateur peut supprimer des éléments de la Collection, il est l'itération. Techniquement, renforcée pour boucles vous permettent de vous faire une boucle sur tout ce qui est Itératif, qui, au minimum, à la fois les Collections et les tableaux.
Ne vous inquiétez pas sur les différences de rendement. Ces micro-optimisation est d'une pertinence de distraction. Si vous avez besoin de supprimer des éléments que vous allez, utiliser un Itérateur. Sinon pour les boucles ont tendance à être utilisé de plus en plus juste parce qu'ils sont plus lisibles, c'est à dire:
vs:
for-each
est une construction de boucle. En interne, il crée un Itérateur et parcourt la Collection. Seul le parti possible de l'aide d'un Itérateur d'objet au-dessus de lafor-each
construire est que vous pouvez modifier votre collection à l'aide d'Itérateur de méthodes comme.remove()
. La modification de la collection sans utiliser l'Itérateur de méthodes lors de l'itération va produire un ConcurrentModificationException.Meilleure façon de le faire est de java 8 est,
Voici quelques liens utiles.
Java 8 Itératif.forEach() vs boucle foreach
http://www.javaworld.com/article/2461744/java-language/java-language-iterating-over-collections-in-java-8.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html
Réponse Simple: non et Non.
À l'intérieur de l'
for-each
boucle crée unIterator
pour parcourir la collection.L'avantage de l'utilisation de la
Iterator
explicitement, c'est que vous pouvez accéder à laIterator
s méthode.Si vous voulez remplacer les éléments de votre Liste, je voudrais aller vieille école avec une boucle for
foreach
utilise les itérateurs sous le capot de toute façon. Il est vraiment juste sucre syntaxique.Considérons le programme suivant:
Nous allons compiler avec
javac Whatever.java
,Et de lire le démonté le bytecode de
main()
, à l'aide dejavap -c Whatever
:Nous pouvons voir que
foreach
compile vers le bas pour un programme qui:List.iterator()
Iterator.hasNext()
: invoqueIterator.next()
et continue de la boucleComme "pourquoi n'est-il pas inutile de boucle optimiser de le code compilé? nous pouvons voir qu'il ne fait rien à l'élément de liste": eh bien, il est possible pour vous de votre code itératif tel que
.iterator()
a des effets secondaires, ou de sorte que.hasNext()
a des effets secondaires ou des conséquences significatives.Vous pouvez facilement imaginer qu'un objet iterable représentant un défilement de requête à partir d'une base de données peut faire quelque chose de spectaculaire sur les
.hasNext()
(comme communiquant avec la base de données, ou la fermeture d'un curseur parce que vous avez atteint la fin du jeu de résultats).Ainsi, même si l'on peut prouver que rien ne se passe dans le corps de la boucle... c'est plus cher (insolubles?) pour prouver que rien de significatif/indirects qui se passe lorsque nous itération. Le compilateur a partir de ce vide corps de boucle dans le programme.
Le meilleur que nous pouvions espérer serait un compilateur avertissement. Il est intéressant de noter que
javac -Xlint:all Whatever.java
ne pas nous avertir de ce vide corps de boucle. IntelliJ IDEA ne bien que. Certes, j'ai configuré l'Ide d'utiliser Eclipse Compilateur, mais qui ne peuvent pas être la raison du pourquoi.Ici est simple extrait de code pour vérifier les performances de
For-each
vsIterator
vsfor
pour la traversée deArrayList<String>
, réalisée sur la version Java 8.Moyenne des valeurs de Sortie: