Si vous vous promenez dans la collection pour lire toutes les valeurs, il n'y a aucune différence entre l'utilisation d'un itérateur ou la nouvelle syntaxe de boucle for, car la nouvelle syntaxe utilise simplement l'itérateur sous l'eau.
Si toutefois, vous entendez par boucle l'ancienne boucle "de style c":
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
La nouvelle boucle for, ou itérateur, peut alors être beaucoup plus efficace, selon la structure de données sous-jacente. La raison en est que pour certaines structures de données, il get(i)
s'agit d'une opération O (n), qui fait de la boucle une opération O (n 2 ). Une liste chaînée traditionnelle est un exemple d'une telle structure de données. Tous les itérateurs ont comme exigence fondamentale qui next()
devrait être une opération O (1), ce qui rend la boucle O (n).
Pour vérifier que l'itérateur est utilisé sous l'eau par la nouvelle syntaxe de boucle for, comparez les bytecodes générés à partir des deux extraits de code Java suivants. 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 deuxièmement, 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, le code d'octet généré est effectivement identique, il n'y a donc aucune pénalité de performance à utiliser l'un ou l'autre formulaire. Par conséquent, vous devez choisir la forme de boucle la plus attrayante pour vous, pour la plupart des personnes qui seront la boucle pour chaque, car elle a moins de code passe-partout.