En supposant que c'est ce que tu voulais dire:
// traditional for loop
for (int i = 0; i < collection.size(); i++) {
T obj = collection.get(i);
// snip
}
// using iterator
Iterator<T> iter = collection.iterator();
while (iter.hasNext()) {
T obj = iter.next();
// snip
}
// using iterator internally (confirm it yourself using javap -c)
for (T obj : collection) {
// snip
}
Itérateur est plus rapide pour les collections sans accès aléatoire (par exemple, TreeSet, HashMap, LinkedList). Pour les tableaux et ArrayLists, les différences de performances devrait être négligeable.
Edit: je crois que les micro-analyse comparative de la racine de joli beaucoup de mal, tout comme au début de l'optimisation. Mais là encore, je pense que c'est bon de ressentir les conséquences de ces tout à fait insignifiantes. Donc j'ai fait un petit test:
- itérer sur une LinkedList et une liste de tableaux respecively
- avec 100 000 "aléatoire" des chaînes
- pour résumer leur longueur (juste quelque chose pour éviter que le compilateur optimise loin la totalité de la boucle)
- en utilisant tous les 3 boucle de styles (itérateur, pour chaque, avec compteur)
Les résultats sont similaires pour tous, mais avec de comptoir" avec LinkedList. Toutes les cinq autres ont eu moins de 20 millisecondes) pour itérer sur l'ensemble de la liste. À l'aide de list.get(i)
sur une LinkedList 100 000 fois a fallu plus de 2 minutes (!) pour terminer (60 000 fois plus lent). Wow! :) Donc il est préférable d'utiliser un itérateur (explicitement ou implicitement en utilisant pour chaque), surtout si vous ne savez pas quel type et la taille de la liste de votre affaire.