使用+ =运算符的java最佳实践

Rob*_*ert 12 java syntax performance bytecode operators

我正在读一本书"Beginning Java 8 Fundamentals".我看到了这一行:

//some code...
sum = sum + i; // Better to use sum += i
//more code...
Run Code Online (Sandbox Code Playgroud)

那么这是我的疑问:这是真的吗?为什么更好地使用+=运营商?我认为+=运算符只是一个更简化的表达式?如果我使用代码性能中的一个或其他含义?

ere*_*can 11

我认为,这本书提供了+=最佳实践.实际上,两个陈述sum += i和之间没有区别sum = sum + i

我实现了2个类,每个类包含一个语句,并使用命令查看字节代码 javap

这是程序1:

public class Program1 {
     public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum += i;
     }
}
Run Code Online (Sandbox Code Playgroud)

这是字节码:

public class Program1 {
  public Program1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}
Run Code Online (Sandbox Code Playgroud)

这是程序2:

public class Program2 {
    public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum = sum + i;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是字节码:

public class Program2 {
  public Program2();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}
Run Code Online (Sandbox Code Playgroud)

如上所示,字节代码是相同的,因此语句是相同的.没有不同.

编辑1:如何运行javap命令

  1. 将Program1.java保存到java文件
  2. 编译代码.跑javac Program1.java
  3. Program1和Program2都应该编译成功.
  4. 运行javap -c Program1.class以查看字节码.

编辑2:如果变量类型不同,则运算符之间的差异

+=运算符具有对左操作符的隐式强制转换,因此如果变量的类型不同,则+=运算符将自动转换.

这是代码

long i = 1;
int sum = 2;
sum += i; //means sum = (int)(i + sum)
Run Code Online (Sandbox Code Playgroud)

此外,sum = sum + i没有隐式转换,这个语句不会编译.

如果需要施放,我通常使用显式施法.这使代码更具可读性和安全性.

  • 很有意思.为int i和double sum做同样的事情,它仍然是一样的吗?或者加倍i和int sum,你应该看到差异 (2认同)

eri*_*cbn 5

正如@Trinimon评论的那样,+=+运营商之间存在差异:

E1 op= E2等价E1 = (T) ((E1) op (E2)),其中T是类型E1,除了E1只评估一次.(§15.26.2复合赋值算子)

所以

int sum = 0;
sum += 1.0; // this is equivalent to sum = (int) (sum + 1.0);
sum = sum + 1.0; // this will not compile
                 // incompatible types: possible lossy conversion from double to int
Run Code Online (Sandbox Code Playgroud)

与常识相反,使用+=操作员更安全.

好问题!

参考

Java的+ =, - =,*=,/ =复合赋值运算符