Si vous êtes juste errer sur la collecte de lire toutes les valeurs, alors il n'y a pas de différence entre l'utilisation d'un itérateur ou la nouvelle boucle for syntaxe, comme la nouvelle syntaxe utilise juste l'itérateur sous-marine.
Si toutefois, tu veux dire par la boucle de la vieille "c" de style boucle:
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
Puis la nouvelle boucle for, ou itérateur, peut être beaucoup plus efficace, en fonction de la structure de données sous-jacente. La raison pour cela est que, pour certaines structures de données, get(i)
est un O(n), ce qui rend la boucle un O(n2) de l'opération. Une traditionnelle liste chaînée est un exemple d'une telle structure de données. Tous les itérateurs ont comme une exigence fondamentale qu' next()
devrait être un O(1), faire la boucle en O(n).
Pour vérifier que l'itérateur est utilisé sous l'eau par la nouvelle boucle for de la syntaxe, de comparer le bytecode généré à partir de deux extraits de code Java. D'abord la boucle for:
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a)
{
integer.toString();
}
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
Et la deuxième, l'itérateur:
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
Comme vous pouvez le voir, à la génération de code octet est effectivement identique, donc il n'y a pas de pénalité sur les performances à l'aide de la forme. Par conséquent, vous devez choisir la forme de la boucle qui est le plus esthétiquement attrayant pour vous, pour la plupart des gens qui seront la boucle for-each, qui a moins de code réutilisable.