哪种情况更快?

时间:2018-04-11 08:34:24

标签: java

我正在开发一个包含大量迭代的代码 我想知道这些条件中的哪一个更有效率。

//1
Boolean.FALSE.equals(x)
//2
x == false
//3
!x

我正在使用第一个,但我不确定。如果有人可以提供一些信息并帮助我,我会很感激。

1 个答案:

答案 0 :(得分:4)

第二个和第三个应该是最快的。第一个涉及额外开销,尽管JIT编译器可能会对其进行优化。

问题更多的是可读性。第一个实际上是不可读的。

根据大众的要求,我已经稍微扩展了答案。我写了这堂课:

package com.severityone.test;

public class Main {

    public static void main(String[] args) {
        final boolean x = false;
        final boolean a = Boolean.FALSE.equals(x);
        final boolean b = x == false;
        final boolean c = !x;
    }
}

这是结果字节代码:

Compiled from "Main.java"
public class com.severityone.test.Main {
  public com.severityone.test.Main();
    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_0
       1: istore_1
       2: getstatic     #2                  // Field java/lang/Boolean.FALSE:Ljava/lang/Boolean;
       5: iconst_0
       6: invokestatic  #3                  // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
       9: invokevirtual #4                  // Method java/lang/Boolean.equals:(Ljava/lang/Object;)Z
      12: istore_2
      13: iconst_1
      14: istore_3
      15: iconst_1
      16: istore        4
      18: return
}

我们从这里可以看到,数字2和3各取两个指令,而数字1取五个。对于大多数程序来说,它没有任何区别,但是如果你在一个紧凑的循环中运行,它可能会有所作为。

至于可读性,&#34;更少的格言更多&#34;去。因为我的眼睛不是100%,所以我有大量文本的问题,所以我更喜欢在我的代码中加入大量的空格。如果您需要撰写Boolean.FALSE.equals(x),并且实际上是您感兴趣的x,则需要在心理上交换整个事物。

至于其他两个,可读性主要取决于个人偏好。对于所有三个选项,都有一些要说的内容:

  1. !x
  2. x == false
  3. false == x
  4. !可能很容易被忽略,如果你有一个很长的表达,例如!((value < 0 || value > 10) && "yes".equals(response))。有些人更喜欢写... == falsefalse == ...,因为你不容易错过它。