刷着题,突然想到是i++效率高,还是i+=1效率高呢,++i、i++到底在字节码层面到底是如何工作的呢?
- 先看一段程序:
public class text {
public static void main(String[] args){
int a = 1;
a=(a++);
System.out.println(a);
int b =1;
b=(++b);
System.out.println(b);
int c = 1;
for(int i=0 ; i<10 ; i++){
c=(c++);
}
System.out.println(c);
int d = 1;
for(int i=0 ; i<10 ; i++){
d=(++d);
}
System.out.println(d);
int e =1;
e+=1;
e++;
System.out.println(e);
}
}
-
对应结果如下:
-
第一个问题:i++,++i的字节码区别?我们分别看其对应的字节码:
对应int a = 1; a=(a++); -
对应int b= 1; b=(++b);区别在于a++是先ILOAD,再IINC,而++b,是先IINC,再ILOAD,这就是输出结果不同的原因:
a++ :是把局部变量表中的值存入到了操作数栈顶的位置,然后IINC直接在局部变量表槽1(局部变量表的存放数据的单位)的位置增加1,这时候a++就结束了!但是当我们进行赋值的时候,它的操作是把操作数栈顶的值返回到槽1中,这时候就把a原本加1的值给覆盖掉了。
b++:是先INNC,直接在局部变量表槽2的位置增加1,然后再执行ILOAD,把值放入到操作数栈顶,然后赋值的时候,同样是把操作数栈顶的值返回到局部变量表槽2中,这时候就没有把b+1的值覆盖掉。 -
第二个问题: 为什么这两段a++,++b在循环后,值却不同呢?(和问题1一样)
-
第三个问题:i++,i+=1到底哪一个效率更高呢?
我们通过字节码进行分析:
通过字节码可以得到:其实都是通过一条字节码指令完成,所以效率差不多(或许在字节码层面分析还是不够严谨(可以看一下相应的本地码,但这就涉及到了使用的虚拟机类型,操作系统,硬件的问题,由大佬解决吧还是)) -
以上仅仅是个人看法,有错误欢迎指出,希望研三能去大厂!