Para complementar lo que se ha dicho y compruebe que la especificación está haciendo lo que dice, vamos a ver el bytecode generado para la siguiente clase, que implementa los bucles de estilo antiguo y nuevo para recorrer una lista devuelta por una llamada a un método, getList()
:
public class Main {
static java.util.List getList() { return new java.util.ArrayList(); }
public static void main(String[] args) {
for (Object o : getList()) {
System.out.print(o);
}
for (java.util.Iterator itr = getList().iterator(); itr.hasNext();) {
Object o = itr.next(); System.out.print(o);
}
}
}
partes pertinentes de la salida:
0: invokestatic #4; //Method getList
3: invokeinterface #5, 1; //InterfaceMethod java/util/List.iterator
8: astore_1
9: aload_1
10: invokeinterface #6, 1; //InterfaceMethod java/util/Iterator.hasNext
15: ifeq 35
18: aload_1
19: invokeinterface #7, 1; //InterfaceMethod java/util/Iterator.next
24: astore_2
25: getstatic #8; //Field java/lang/System.out
28: aload_2
29: invokevirtual #9; //Method java/io/PrintStream.print
32: goto 9
35: invokestatic #4; //Method getList
38: invokeinterface #10, 1; //InterfaceMethod java/util/List.iterator
43: astore_1
44: aload_1
45: invokeinterface #6, 1; //InterfaceMethod java/util/Iterator.hasNext
50: ifeq 70
53: aload_1
54: invokeinterface #7, 1; //InterfaceMethod java/util/Iterator.next
59: astore_2
60: getstatic #8; //Field java/lang/System.out
63: aload_2
64: invokevirtual #9; //Method java/io/PrintStream.print
67: goto 44
70: return
Esto muestra que el primer bucle (0 a 32) y el segundo (35-67) son idéntica.
El bytecode generado es exactamente el mismo.
Sinceramente espero que sí, de lo contrario tengo un montón de código para reescribir ... – skaffman
posible duplicado de http://stackoverflow.com/questions/1618202/java-foreach-loop –
@Pascal Thivent - Sí, pero mi título es mejor :) – morgancodes