Aquí es una clase de muestra:
public class Increment
{
public static void main(String [] args)
{
for (int i = 0; i < args.length; ++i)
{
System.out.println(args[i]);
}
}
}
Si Puedo desmontar esta clase mediante javap.exe me sale esto:
Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
}
Si cambio el bucle por lo que utiliza i ++ y desmontar de nuevo consigo esto:
Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
}
Cuando comparo los dos, TextPad me dice que los dos son idénticos.
Lo que esto dice es que desde el punto de vista del código de bytes generado no hay diferencia en un bucle. En otros contextos, existe una diferencia entre ++ iy i ++, pero no para los bucles.
Muchas instancias existentes. Respuesta corta: para tipos nativos nada. http://stackoverflow.com/questions/484462/difference-between-i-and-i-in-a-loop http://stackoverflow.com/questions/1941391/java-to-i-or-i-and -whats-the-difference-closed y muchos otros tomados de http://stackoverflow.com/search?q=i%2B%2B+%2B%2Bi – dmckee
relacionado: http://stackoverflow.com/questions/1756015/whats -the-difference-between-i-and-i-in-php – jldupont
++ debería ser más eficiente en teoría ya que i ++ simplemente a ++ iy una copia (para guardar el valor anterior) Pero supongo que JVM optimizará el último en un bucle for (al menos cualquier compilador lo haría ...) -> sin diferencia – user3063349