== 检查布尔值是不是完全相等? - 爪哇
Posted
技术标签:
【中文标题】== 检查布尔值是不是完全相等? - 爪哇【英文标题】:Does == check for full equality in Booleans? - Java== 检查布尔值是否完全相等? - 爪哇 【发布时间】:2012-06-19 20:00:45 【问题描述】:所以我听说如果我将 2 个字符串与 == 进行比较,那么只有当它们都引用同一个对象/实例时,我才会返回 true。那是字符串。布尔值呢?
【问题讨论】:
字符串如何引用同一个实例而不是相同的? 不,我的意思是如果它们相同但不指的是同一个实例,== 返回 false。 发帖前请先阅读任何内容,不要以我在某处听到什么开头。 我听说过 = 我知道在上述情况下。不是说你应该知道这一点,只是澄清一下。 【参考方案1】:== 检查布尔值是否完全相等? - 爪哇
这取决于您是在谈论Boolean
s(对象包装器,注意大写B
)还是boolean
s(原语,注意小写b
)。如果您谈论的是Boolean
s(对象包装器),与所有对象一样,==
会检查身份,而不是等价。如果您谈论的是boolean
s(原语),它会检查是否等价。
所以:
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
,而不是==
。由于intern
ing 是字符串特有的,字符串可能会有些混乱(Boolean
没有等价物,尽管当您使用Boolean.valueOf(boolean)
时,您将获得一个缓存对象)。另请注意,Java 没有原始字符串,如原始 boolean
、int
等。
【讨论】:
所以如果我使用new boolean
来创建变量,而不是new Boolean
,==
将与equals()
相同?
@Bluefire:你根本不使用new boolean
(小写)。您使用true
或false
或比较操作的结果。我认为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.TRUE
Boolean.FALSE
。如果您遵循该规则,您实际上可以将它们与 ==
进行比较(尽管您可能仍然不应该这样做)。【参考方案2】:
这取决于您是否在谈论值类型,例如:int
、boolean
、long
或引用类型:Integer
、Boolean
、Long
。值类型可以和==
比较,引用类型必须和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将 (==
) 与布尔值一起使用时,
如果其中一个操作数是布尔包装器,则首先将其拆箱 转换成一个布尔基元,然后将两者进行比较。
如果两者都是布尔包装器,使用 'new' 关键字创建,那么它们的
引用的比较就像其他对象的情况一样。new Boolean("true") == new Boolean("true")
为假
如果两者都是布尔包装器,创建时没有'new'关键字,
Boolean a = false;
Boolean b = Boolean.FALSE;
// (a==b) return true
【讨论】:
以上是关于== 检查布尔值是不是完全相等? - 爪哇的主要内容,如果未能解决你的问题,请参考以下文章