哪一个在java中的布尔值方面效率更高?
Boolean boolean;
if(boolean == false) {}
OR
if(!boolean) {}
答案 0 :(得分:3)
性能差异完全是微不足道的;事实上,我想这些都编译成完全相同的bytecode(这意味着零性能差异)。选择你认为看起来更清洁的选项。
旁注:"布尔"是Java中的保留字,因此您需要一个不同的变量名。此外,除非你需要你的布尔值作为一个对象(你很少需要这样做),你应该使用boolean
基元类型而不是Boolean
对象类型; Boolean
对象类型有更多的内存开销。
答案 1 :(得分:1)
两者都是正确的,但第二个更优雅:
if(!boolean) {}
答案 2 :(得分:1)
代码块:
if(!boolean) {}
是一个更清晰的代码,可以提高可读性。
没有性能提升。
答案 3 :(得分:0)
哪一个更有效
这两种方法都具有相同的性能,因为!b
和b==false
在字节代码处被ifne
替换。
但是第二个版本
if (!b){...}
更安全因为它避免了常见的错误/拼写错误而不是==
我们会使用=
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
因此编译器再次生成相同的字节码。