使用+ = operator

时间:2015-04-23 17:31:09

标签: java performance syntax operators bytecode

我正在读一本书“Beginning Java 8 Fundamentals”。我看到了这句话:

//some code...
sum = sum + i; // Better to use sum += i
//more code...

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

3 个答案:

答案 0 :(得分:11)

我认为,这本书提供了使用+=作为最佳实践。实际上,sum += isum = sum + i

的两个陈述之间没有区别

我实现了2个类,每个类包含一个语句,并使用命令javap

观察字节代码

这是程序1:

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

这是字节代码:

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
}

这是程序2:

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

这是字节代码:

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
}

如上所示,字节代码相同,因此语句是相同的。没有区别。

编辑1:如何运行javap命令

  1. 将Program1.java保存到java文件
  2. 编译代码。运行javac Program1.java
  3. Program1和Program2都应该成功编译。
  4. 运行javap -c Program1.class以查看字节码。
  5. 编辑2:如果变量类型不同,则运算符之间存在差异

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

    这是代码

    long i = 1;
    int sum = 2;
    sum += i; //means sum = (int)(i + sum)
    

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

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

答案 1 :(得分:5)

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

  

E1 op= E2相当于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1仅评估一次。 (§15.26.2 Compound Assignment Operators

所以

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

与常识相反,使用+=运算符更安全

好问题!

参考

Java's +=, -=, *=, /= compound assignment operators

答案 2 :(得分:1)

没有性能差异。一种方法可能会略好一些。

可以认为sum += i;是更好的风格,因为它不是多余的,读者可能需要稍微减少工作来弄清楚+=发生了什么,因为它&# 39;没有必要在赋值运算符的两边寻找和。

&#34;最佳实践&#34;至少存在与可读性和可维护性问题一样多的问题,而不是表现性,不要假设一切都与性能有关。

在涉及隐式演员表的一些模糊案例中使用+=可能会有问题。有一个Java益智游戏(来自Bloch和Gafter的书)设法滥用这个,see this question