i=i+1 与 i+=1 区别

Myth丶恋晨 2022-03-06 13:10 466阅读 0赞

满脑子的黑人问号有没有,有的话点一波关注:)

起初我也是一脸蒙逼,随着知识的积累,有了新的思考,记录下来仅供参考。

从执行效率上来说,i+=1更优

我们先来看一段代码

  1. public class PlusEqualTest {
  2. void m1() {
  3. int i = 0;
  4. i+=1;
  5. }
  6. void m2() {
  7. int i = 0;
  8. i=i+1;
  9. }
  10. }

执行效率,是要站在JVM的角度上的,所以使用javap -verbose xxx.class 将字节码文件翻译成指令的形式,更容易理解

这里我只展示m1 m2中的部分指令

  1. void m1();
  2. 0: iconst_0
  3. 1: istore_1
  4. 2: iinc 1, 1
  5. 5: return
  6. void m2();
  7. 0: iconst_0
  8. 1: istore_1
  9. 2: iload_1
  10. 3: iconst_1
  11. 4: iadd
  12. 5: istore_1
  13. 6: return

明显可以看到,i+=1的执行步骤更少。解释下m1 m2 中指令的含义

m1:

  1. 将常量0压入操作栈
  2. 将数据保存到局部变量表中第一个格子
  3. 在局部变量表第一个格子内部加1然后保存

m2:

  1. 将常量压入操作栈
  2. 弹出栈顶元素,保存到局部变量表中第一个格子
  3. 将局部变量表中第一个格子压入操作栈
  4. 将常量1压入操作栈
  5. 弹出操作栈中前两个元素,CPU执行加运算
  6. 保存结果到局部变量第一个格子

从java语法上来说

i=i+1 在进行运算时会进行自动类型转换,然后再进行赋值,如果右边的类型比左边的大,则编译报错

i+=1 避免了上述操作,但是可能导致内存溢出(比如 i=127)

从编码的角度来说

i=i+1更一目了然

综上所述,虽然i+=1的执行效率更高,但是jvm足够强大,不用在乎这一点优化,所以我推荐使用i=i+1

发表评论

表情:
评论列表 (有 0 条评论,466人围观)

还没有评论,来说两句吧...

相关阅读

    相关 i++++i区别

    1、赋值顺序不同 \++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的。 因为++i 是后面一步才赋值的,所以它能够当作一个变

    相关 i=i+1 i+=1 区别

    满脑子的黑人问号有没有,有的话点一波关注:) 起初我也是一脸蒙逼,随着知识的积累,有了新的思考,记录下来仅供参考。  从执行效率上来说,i+=1更优 我们先来看一段代