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命令
javac Program1.javajavap -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没有隐式转换,这个语句不会编译.
如果需要施放,我通常使用显式施法.这使代码更具可读性和安全性.
正如@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)
与常识相反,不使用+=操作员更安全.
好问题!
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |