Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较布尔值?_Java_Boolean - Fatal编程技术网

Java 如何比较布尔值?

Java 如何比较布尔值?,java,boolean,Java,Boolean,以此为例(摘自): 如果使用.equals(false)检查布尔检查器的值,这是否重要 我知道有一个非常相似的例子。然而,很明显,这个问题涉及的是原语布尔,而不是对象包装,布尔;因此,.equals()将不适用 另外,如果对布尔值的处理方式与布尔值不同?只要检查器不是空,您就可以使用!已过帐的检查人。自Java 5以来,这是可能的,因为此布尔变量将自动装箱到原始布尔值。.equals(false)将变得更慢,因为您在对象上调用虚拟方法,而不是使用更快的语法,这是大多数程序员都没有想到的,因为通常

以此为例(摘自):

如果使用
.equals(false)
检查
布尔检查器的值,这是否重要

我知道有一个非常相似的例子。然而,很明显,这个问题涉及的是原语
布尔
,而不是对象包装,
布尔
;因此,
.equals()
将不适用


另外,如果对
布尔值
的处理方式与
布尔值
不同?

只要
检查器
不是
,您就可以使用
!已过帐的检查人
。自Java 5以来,这是可能的,因为此
布尔
变量将自动装箱到原始
布尔
值。

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

使用直接条件(like==,!=,!condition)将比.equals(condition)稍有性能改进,因为在一种情况下,您是从对象调用方法,而直接执行比较。

从您的评论来看,您似乎在寻找“最佳实践”用于使用
Boolean
包装类。但实际上没有任何最佳实践,因为一开始就使用此类是个坏主意。使用对象包装的唯一原因是在您绝对必须的情况下(例如在使用时,即在
HashMap
等中存储
Boolean
)。使用对象包装器既没有好处,也有很多缺点,最明显的是,它使您可以使用
NullPointerException
s

布尔值是否使用“!”而不是.equals()

这两种技术都会受到
NullPointerException
的影响,因此这一点无关紧要。在第一种情况下,
Boolean
将被放入其各自的
Boolean
值中,并与正常值进行比较。在第二种情况下,您将从
Boolean
类调用一个方法,即:

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

如果使用.equals(false)检查布尔检查器的值是否重要

根据上文,没有

第二个问题:布尔运算应该与布尔运算不同吗

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

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

但是说真的……只要使用原语类型,除非你被迫不这样做。

关于直接操作的性能和方法
.equals()
.equals()
方法似乎比
=
慢大约4倍

我进行了以下测试

对于
==
的性能:

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);
    }
}
=
的总系统时间为
1

.equals()
的总系统时间在
3-5

因此,可以肯定地说,
.equals()
会妨碍性能,而且在大多数情况下,比较
布尔值时最好使用
=
,尝试以下方法:

if (Boolean.TRUE.equals(yourValue)) { ... }
作为附加好处,这是空安全的。

作为对象

等于

公共布尔等于(对象obj)

当且仅当参数不为null且是表示与此对象相同的布尔值的布尔对象时,返回true

覆盖: 类对象中的等于

参数: obj-要与之进行比较的对象

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


输出:a等于(b):false

为什么您要从这里开始使用
Boolean
而不是
Boolean
?是的,我不知道这个用例。这似乎是一个纯粹的学术问题。@JonSkeet
这个问题适用于所有Java布尔比较,而不仅仅是链接
。我想知道对所有
Boolean的更好的做法e> 比较比较没有比较
布尔
s而不是
布尔
s的最佳实践,因为比较对象包装器已经是一种糟糕的实践。哈哈。没有理由使用它,它只会让你遇到不必要的错误,如
NullPointerException
s。除了系统性能之外,这两种方法有什么区别吗没有区别?@ylun好吧,你也有编码约定-使用方法打破了它们。有关于约定的具体文档可供比较吗?我似乎在@ylun中找不到它们。这是众所周知的约定,我从来没有见过有人使用
.equals(false)
在我10年的编程生涯中,他们的代码是标准的。阅读其他人的代码,看看Java文档中的示例-你不会找到它。你说的“直接执行比较”是什么意思?我的解释是:不需要访问另一个类中的方法来执行比较,因此速度更快。?是的-基本上是因为您链接到超类并从中调用方法。但是根据比较的性质,您可能希望坚持使用.equals()关于“==”。好的,我对你和@Migol说的话做了一些研究。我偶然发现。更具体地说,
Steve Kuo
说,
equals很可能由JIT内联,所以性能不是问题。他这是什么意思?该死,错过了编辑的时间限制。关于我的评论,Steve的评论似乎与你关于性能的陈述相反。关于你对
的回答,如果使用.equals(false)检查布尔检查器的值有关系吗?
。Sunil和Migol都说
.equals()
会妨碍性能。然而,我发现Steve Kuo的命令
boolean easyToUseValue = value != null ? value : false;
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);
    }
}
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);
    }
}
if (Boolean.TRUE.equals(yourValue)) { ... }
boolean a = true;
boolean b = false;

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