关于Java:如何比较布尔?

How to compare Boolean?

以此为例(摘自JavaReX检查器不工作):

1
2
3
4
5
6
7
while(!checker) {
    matcher = pattern.matcher(number);
    if(matcher.find())
        checker = true;
    else
        year++;
}

如果使用.equals(false)来检查Boolean checker的值会有什么关系?

我知道这里也有类似的地方。但是,显然这个问题涉及的是原始的boolean,而不是对象包装器boolean;因此,.equals()不适用。

另外,是否应将booleanboolean区别对待?


试试这个:

1
if (Boolean.TRUE.equals(yourValue)) { ... }

作为额外的好处,这是空安全。


从您的评论来看,您似乎在寻找使用Boolean包装类的"最佳实践"。但实际上没有任何最佳实践,因为从这个类开始使用是一个坏主意。使用对象包装器的唯一原因是在必须使用的情况下(例如在使用泛型时,即在HashMap或类似文件中存储Boolean)。使用对象包装器没有好处,也没有很多缺点,最明显的是,它使您能够使用NullPointerException

Does it matter if '!' is used instead of .equals() for Boolean?

这两种技术都容易受到NullPointerException的影响,因此在这方面并不重要。在第一种情况下,Boolean将被取消绑定到其各自的Boolean值中,并与正常值进行比较。在第二个场景中,您从Boolean类调用一个方法,如下所示:

1
2
3
4
5
6
public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

不管怎样,结果都是一样的。

Would it matter if .equals(false) was used to check for the value of the Boolean checker?

以上,没有。

Secondary question: Should Boolean be dealt differently than boolean?

如果您绝对必须使用Boolean类,在执行任何比较之前,一定要检查null类。例如。,

1
2
3
4
5
6
Map<String, Boolean> map = new HashMap<String, Boolean>();
//...stuff to populate the Map
Boolean value = map.get("someKey");
if(value != null && value) {
    //do stuff
}

这将工作,因为Java短路条件评估。也可以使用三元运算符。

1
boolean easyToUseValue = value != null ? value : false;

但说真的…只需使用基本类型,除非您被迫不使用。


关于直接操作的执行和方法.equals().equals()方法的速度大约是==方法的4倍。

我做了以下测试。

执行==时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BooleanPerfCheck {

    public static void main(String[] args) {
        long frameStart;
        long elapsedTime;

        boolean heyderr = false;

        frameStart = System.currentTimeMillis();

        for (int i = 0; i < 999999999; i++) {
            if (heyderr == false) {
            }
        }

        elapsedTime = System.currentTimeMillis() - frameStart;
        System.out.println(elapsedTime);
    }
}

对于.equals()的性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BooleanPerfCheck {

    public static void main(String[] args) {
        long frameStart;
        long elapsedTime;

        Boolean heyderr = false;

        frameStart = System.currentTimeMillis();

        for (int i = 0; i < 999999999; i++) {
            if (heyderr.equals(false)) {
            }
        }

        elapsedTime = System.currentTimeMillis() - frameStart;
        System.out.println(elapsedTime);
    }
}

==系统总时间为1

.equals()的总系统时间与3 - 5不同。

因此,可以肯定的说,.equals()阻碍了性能,并且在大多数情况下,==更好地用于比较Boolean


使用直接条件(如==,!=,!Condition)的性能比.Equals(Condition)稍有改善,因为在一种情况下,您从对象调用方法,而直接比较是直接执行的。


只要checker不是null,您可以使用发布的!checker。这是可能的,因为Java 5,因为这个EDCOX1×3变量将被自动装箱到PREVIVITE EDOCX1×3的值。


作为对象?

等于

公共布尔等于(对象obj)

如果且仅当参数不为空并且是表示与此对象相同布尔值的布尔对象时返回true。

超越:类对象中的等于

参数:对象-要比较的对象。

返回:如果布尔对象表示相同的值,则为true;否则为false。

1
2
3
4
boolean a = true;
boolean b = false;

System.out.println("a.equals(b):" + ((Object)a).equals( ((Object)b) ));

输出:A.等于(B):假


.equals(false)将变慢,因为您在对象上调用一个虚拟方法,而不是使用更快的语法,而且大多数程序员都很意外,因为通常使用的代码标准并不认为您应该通过.equals(false)方法进行检查。