Прежде всего, спецификация языка Java ничего не говорит о времени. Но предполагая, что мы используем типичный компилятор, такой как Suns javac, мы видим, что все приведенные выше примеры (a++
, ++a
, a += 1
, a = a + 1
) могут быть скомпилированы в нечто вроде:
iinc
инструкция, работающая с переменными:
iload_<variable>
iinc <variable>, 1
istore_<variable>
iadd
, используя стек (здесь используется переменная 1
в качестве хранилища):
iload_1
iconst_1
iadd
istore_1
Компилятор должен выбрать наилучший из возможных способов их компиляции. Например. между ними нет разницы . И не должно быть никакой разницы между утверждениями - все они выражают одно и то же - добавляя один к числу.
В связи с этим версия iinc
и iadd
может быть скомпилирована с использованием JIT для чего-то быстрого и зависящего от платформы, и в конце я бы предположил, что обычное время выполнения компилирует обе версии в один и тот же код ассемблера .
С моим компилятором * jdk1.6.0_20 * методы «приращения» даже используют одну и ту же инструкцию.
public class Test {
public static void main(String[] args) {
int a = 0;
a = a + 1;
a += 1;
a++;
++a;
}
}
Это разборка:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iinc 1, 1 // a = a + 1;
5: iinc 1, 1 // a += 1;
8: iinc 1, 1 // a++;
11: iinc 1, 1 // ++a;
14: return
}