每日查漏补缺计划(第二日)
关于i++和++i从字节码角度分析
直接上代码解释
//前++和后++
public void method(){
int i=10;
++i;
}
public void method7(){
int i=10;
i++;
}
从字节码的角度分析我们可以发现 在不涉及具体运算的时候,i++和++i是完全相同的。
- 从这里我们可以看出如果不涉及操作符运算的话那么是完全一样的。
- 这也可以得出for循环中为什么I++和++I都可以
- 有人说++i比i++更快我没有测试
涉及到具体的运算符指令
public void method8(){
int i=10;
int a=i++;
int j=20;
int b=++j;
a=10
b=21
}
public void method9(){
int j=10;
j=++j+j++;
j=22
}
public void method10(){
int i=10;
i=i++;
i=10;
}
从字节码的角度分析
- 先将10压入操作数栈
- 将10存储到局部变量表1的位置
- 将i的数值加载到操作数栈中
- i的数值自增也就是+1=11
- 将操作数栈中的十压入到局部变量表2的位置
- 将20压入操作数栈中
- 将20放入局部变量表3的位置
- 局部变量表3位置+1,变成21
- 将21加载到操作数栈中
- 将操作数栈中的21又加载到局部变量表4的位置
所以我们会发现,i++和++i本质上是三步操作涉及到运算符的时候,首先将某个数字存储到操作数栈中,然后又将操作数栈的数存储到局部变量表中,如果是++i,则会在局部变量表中先进行自增,然后存储到操作数栈中,如果是i++则相反。
这里有个小细节,如果是static方法,那么istore是从0开始的,如果是类方法那么是从1开始的。