Si solo está deambulando por la colección para leer todos los valores, entonces no hay diferencia entre usar un iterador o la nueva sintaxis de bucle, ya que la nueva sintaxis solo usa el iterador bajo el agua.
Sin embargo, si quiere decir por bucle el viejo bucle "c-style":
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
Entonces, el nuevo for loop, o iterador, puede ser mucho más eficiente, dependiendo de la estructura de datos subyacente. La razón de esto es que para algunas estructuras de datos, get(i)
es una operación O (n), lo que hace que el bucle sea una operación O (n 2 ). Una lista vinculada tradicional es un ejemplo de dicha estructura de datos. Todos los iteradores tienen como requisito fundamental que next()
debería ser una operación O (1), haciendo que el bucle O (n).
Para verificar que el nuevo iterador utiliza el iterador bajo el agua para la sintaxis de bucle, compare los códigos de byte generados a partir de los siguientes dos fragmentos de código Java. Primero el bucle 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
Y segundo, el iterador:
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
Como puede ver, el código de byte generado es efectivamente idéntico, por lo que no hay penalización de rendimiento al usar cualquiera de los formularios. Por lo tanto, debe elegir la forma de bucle que sea más estéticamente atractiva para usted, para la mayoría de las personas que será el bucle para cada, ya que tiene menos código repetitivo.