哪个效率更高
由于!b 和b==false 在字节码处被ifne 替换,这两种方法的性能相同。
但是第二个版本
if (!b){...}
是更安全,因为它避免了常见的错误/错别字,而不是==,我们将使用= like
if (b = false){/* this code will never be executed */}
Boolean 的证明。
让我们看看如何编译这些方法:
public void t1(Boolean b) {
if (b == false) {
System.out.println("foo");
}
}
public void t2(Boolean b) {
if (!b) {
System.out.println("foo");
}
}
在javap -c NameOfClassWithTheseMethods 的帮助下,我们能够看到这一点
t1会被编译成
public void t1(java.lang.Boolean);
Code:
0: aload_1
1: invokevirtual #16 // Method java/lang/Boolean.booleanValue:()Z
4: ifne 15
7: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
10: ldc #28 // String foo
12: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: return
和t2 进入
public void t2(java.lang.Boolean);
Code:
0: aload_1
1: invokevirtual #16 // Method java/lang/Boolean.booleanValue:()Z
4: ifne 15
7: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
10: ldc #28 // String foo
12: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: return
所以对于这两种方法,编译器都生成了相同的字节码。
boolean 的证明。
如果我们重新编译
public void b1(boolean b) {
if (b == false) {
System.out.println("foo");
}
}
public void b2(boolean b) {
if (!b) {
System.out.println("foo");
}
}
我们会得到:
public void b1(boolean);
Code:
0: iload_1
1: ifne 12
4: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #28 // String foo
9: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
public void b2(boolean);
Code:
0: iload_1
1: ifne 12
4: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #28 // String foo
9: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
所以编译器又生成了相同的字节码。