我们经常会被问到i++与++i的区别,一般我们都会这样回答:i++表示,先返回再加1,++i表示,先加1再返回。但这只是宏观层面的,那它的底层是怎么样的呢? 我们一起探究下,这样我们可以更好地理解它,知其然并且知其所以然。
public class Test {
public static void main(String[] args) {
new Test().method1();
new Test().method2();
}
public void method1(){
int i = 1;
int a = i++;
System.out.println(a); //打印出结果是1
}
public void method2(){
int i = 1;
int a = ++i;
System.out.println(a); //打印出结果是2
}
}
反编译
javap -c Test.class
看下i++的反编译结果,最终是从本地的变量表中取出下标为2值为1的压入了栈中。
再看++i的反编译结果,最终是从本地变量表中取出下标为2值为2的压入了栈中。
总结
区别:
i++
- 只是在本地变量中对数字做了相加,并没有将数据压入到操作栈
- 将前面拿到的数字1,再次从操作栈中拿到,压入到本地变量中中
++i
- 将本地变量中的数字做了相加,并且将数据压入栈
- 将操作栈中的数据,再次压入到本地变量中
总之,对比我们可以看出两者之间最终都会在本地变量表中加一,只是最后入栈的值不一样而已,所以它们效率也是一样的。