哪一个在java中的布尔值方面更有效?

时间:2016-01-28 16:25:29

标签: java performance if-statement boolean conditional-statements

哪一个在java中的布尔值方面效率更高?

Boolean boolean;
if(boolean == false) {}

OR

if(!boolean) {}

4 个答案:

答案 0 :(得分:3)

性能差异完全是微不足道的;事实上,我想这些都编译成完全相同的bytecode(这意味着零性能差异)。选择你认为看起来更清洁的选项。

旁注:"布尔"是Java中的保留字,因此您需要一个不同的变量名。此外,除非你需要你的布尔值作为一个对象(你很少需要这样做),你应该使用boolean基元类型而不是Boolean对象类型; Boolean对象类型有更多的内存开销。

答案 1 :(得分:1)

两者都是正确的,但第二个更优雅:

  if(!boolean) {}

答案 2 :(得分:1)

代码块:

if(!boolean) {} 

是一个更清晰的代码,可以提高可读性。

没有性能提升。

答案 3 :(得分:0)

  

哪一个更有效

这两种方法都具有相同的性能,因为!bb==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

因此编译器再次生成相同的字节码。