i=i+1 与 i+=1 区别
满脑子的黑人问号有没有,有的话点一波关注:)
起初我也是一脸蒙逼,随着知识的积累,有了新的思考,记录下来仅供参考。
从执行效率上来说,i+=1更优
我们先来看一段代码
public class PlusEqualTest {
void m1() {
int i = 0;
i+=1;
}
void m2() {
int i = 0;
i=i+1;
}
}
执行效率,是要站在JVM的角度上的,所以使用javap -verbose xxx.class 将字节码文件翻译成指令的形式,更容易理解
这里我只展示m1 m2中的部分指令
void m1();
0: iconst_0
1: istore_1
2: iinc 1, 1
5: return
void m2();
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: istore_1
6: return
明显可以看到,i+=1的执行步骤更少。解释下m1 m2 中指令的含义
m1:
- 将常量0压入操作栈
- 将数据保存到局部变量表中第一个格子
- 在局部变量表第一个格子内部加1然后保存
m2:
- 将常量压入操作栈
- 弹出栈顶元素,保存到局部变量表中第一个格子
- 将局部变量表中第一个格子压入操作栈
- 将常量1压入操作栈
- 弹出操作栈中前两个元素,CPU执行加运算
- 保存结果到局部变量第一个格子
从java语法上来说
i=i+1 在进行运算时会进行自动类型转换,然后再进行赋值,如果右边的类型比左边的大,则编译报错
i+=1 避免了上述操作,但是可能导致内存溢出(比如 i=127)
从编码的角度来说
i=i+1更一目了然
综上所述,虽然i+=1的执行效率更高,但是jvm足够强大,不用在乎这一点优化,所以我推荐使用i=i+1
还没有评论,来说两句吧...