我正在读一本书“Beginning Java 8 Fundamentals”。我看到了这句话:
//some code...
sum = sum + i; // Better to use sum += i
//more code...
然后我怀疑:这是真的吗?为什么使用+=
运算符会更好?我认为+=
运算符只是一个更简化的表达式?如果我使用代码性能中的一个或其他含义?
答案 0 :(得分: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;
}
}
这是字节代码:
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命令
javac Program1.java
javap -c Program1.class
以查看字节码。编辑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))
,其中T
是E1
的类型,但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
与常识相反,使用+=
运算符更安全不。
好问题!
答案 2 :(得分:1)
没有性能差异。一种方法可能会略好一些。
可以认为sum += i;
是更好的风格,因为它不是多余的,读者可能需要稍微减少工作来弄清楚+=
发生了什么,因为它&# 39;没有必要在赋值运算符的两边寻找和。
&#34;最佳实践&#34;至少存在与可读性和可维护性问题一样多的问题,而不是表现性,不要假设一切都与性能有关。
在涉及隐式演员表的一些模糊案例中使用+=
可能会有问题。有一个Java益智游戏(来自Bloch和Gafter的书)设法滥用这个,see this question。