我正在开发一个包含大量迭代的代码 我想知道这些条件中的哪一个更有效率。
//1
Boolean.FALSE.equals(x)
//2
x == false
//3
!x
我正在使用第一个,但我不确定。如果有人可以提供一些信息并帮助我,我会很感激。
答案 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
,则需要在心理上交换整个事物。
至于其他两个,可读性主要取决于个人偏好。对于所有三个选项,都有一些要说的内容:
!x
x == false
false == x
!
可能很容易被忽略,如果你有一个很长的表达,例如!((value < 0 || value > 10) && "yes".equals(response))
。有些人更喜欢写... == false
或false == ...
,因为你不容易错过它。