== 检查布尔值是不是完全相等? - 爪哇

Posted

技术标签:

【中文标题】== 检查布尔值是不是完全相等? - 爪哇【英文标题】:Does == check for full equality in Booleans? - Java== 检查布尔值是否完全相等? - 爪哇 【发布时间】:2012-06-19 20:00:45 【问题描述】:

所以我听说如果我将 2 个字符串与 == 进行比较,那么只有当它们都引用同一个对象/实例时,我才会返回 true。那是字符串。布尔值呢?

【问题讨论】:

字符串如何引用同一个实例而不是相同的? 不,我的意思是如果它们相同但指的是同一个实例,== 返回 false。 发帖前请先阅读任何内容,不要以我在某处听到什么开头。 我听说过 = 我知道在上述情况下。不是说你应该知道这一点,只是澄清一下。 【参考方案1】:

== 检查布尔值是否完全相等? - 爪哇

这取决于您是在谈论Booleans(对象包装器,注意大写B)还是booleans(原语,注意小写b)。如果您谈论的是Booleans(对象包装器),与所有对象一样,== 会检查身份,而不是等价。如果您谈论的是booleans(原语),它会检查是否等价。

所以:

Boolean a, b;
a = new Boolean(false);
b = new Boolean(false);
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance

但是

boolean c, d;
c = false;
d = false;
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value

关于字符串:

我听说如果我将 2 个字符串与 == 进行比较,那么只有当字符串相同并且它们都引用相同的对象/实例时,我才会返回 true...

这并不是真正的“和”:==检查两个 String 变量是否引用同一个 String 实例。当然,一个String实例只能有一组内容,所以如果两个变量都指向同一个实例,内容自然是一样的... :-) 关键是==会报@987654336 @ 表示 不同 String 实例,即使它们以相同的顺序具有相同的字符。这就是为什么我们在它们上使用equals,而不是==。由于interning 是字符串特有的,字符串可能会有些混乱(Boolean 没有等价物,尽管当您使用Boolean.valueOf(boolean) 时,您将获得一个缓存对象)。另请注意,Java 没有原始字符串,如原始 booleanint 等。

【讨论】:

所以如果我使用new boolean 来创建变量,而不是new Boolean== 将与equals() 相同? @Bluefire:你根本不使用new boolean(小写)。您使用truefalse 或比较操作的结果。我认为Boolean 的现代 Java 用例很少。 所以要声明一个原始布尔值,我是否可以输入 boolean myBoolean = true 之类的内容? @Bluefire:是的。或者 boolean myBoolean = false; 或者只是 boolean myBoolean; 如果你不想在以后初始化它。不需要构造基元(所以就像int n = 5; 或只是int n;boolean b = false; 或只是boolean b;)。 @Bluefire 请注意,如果你真的想要Boolean,你永远不应该调用new Boolean,而是分别使用Boolean.TRUEBoolean.FALSE。如果您遵循该规则,您实际上可以将它们与 == 进行比较(尽管您可能仍然不应该这样做)。【参考方案2】:

这取决于您是否在谈论值类型,例如:intbooleanlong 或引用类型:IntegerBooleanLong。值类型可以和==比较,引用类型必须和equals比较。

【讨论】:

【参考方案3】:

如果你有一个 Object 使用 equals, 如果没有,你可以在这样的事情上运行。 (自动装箱原语的 VM 缓存)

    public static void main(String[] args)
       Boolean a = true;
       Boolean b = true;
       System.out.println(a == b);
       a = new Boolean(true);
       b = new Boolean(true);
       System.out.println(a == b);
   

输出为 TRUE 和 FALSE

【讨论】:

这并没有改善答案,请仅在改善已提交答案的情况下添加答案 实际上原始答案缺少自动装箱示例。我遇到了以下代码: Optional a = f();可选 b = g(); if (a.isPresent() && b.isPresent() && a.get() != b.get()) ... 看起来像一个错误。它不是错误的原因是 f() 和 g() 正在返回诸如 Optional.of(true) 等内容,并且自动装箱功能使其正确。但是请注意,对于 int 自动装箱“缓存”的值只能达到 127 或类似的值,因此最好避免依赖“缓存”。【参考方案4】:

将 (==) 与布尔值一起使用时,

    如果其中一个操作数是布尔包装器,则首先将其拆箱 转换成一个布尔基元,然后将两者进行比较。

    如果两者都是布尔包装器,使用 'new' 关键字创建,那么它们的 引用的比较就像其他对象的情况一样。new Boolean("true") == new Boolean("true") 为假

    如果两者都是布尔包装器,创建时没有'new'关键字,

    Boolean a = false;
    Boolean b = Boolean.FALSE;
    // (a==b) return true
    

【讨论】:

以上是关于== 检查布尔值是不是完全相等? - 爪哇的主要内容,如果未能解决你的问题,请参考以下文章

检查两个值是不是存在并返回命名布尔值

检查是不是设置了 Javascript 布尔值? [复制]

检查数组中的所有布尔值是不是为真?

检查可为空的布尔值是不是为空[重复]

Python:如何检查列表是不是包含数值并返回布尔值?

检查三个布尔值中的两个是不是为真?