我们经常会被问到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
- 将本地变量中的数字做了相加,并且将数据压入栈
- 将操作栈中的数据,再次压入到本地变量中
总之,对比我们可以看出两者之间最终都会在本地变量表中加一,只是最后入栈的值不一样而已,所以它们效率也是一样的。