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:

  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

猜你喜欢

转载自blog.csdn.net/qq_28411869/article/details/88654210