【问题标题】:Boolean.TRUE == myBoolean vs. Boolean.TRUE.equals(myBoolean)Boolean.TRUE == myBoolean 与 Boolean.TRUE.equals(myBoolean)
【发布时间】:2013-05-02 11:31:51
【问题描述】:

在处理Boolean 对象时,是否存在使用equals(Boolean)== 会返回不同结果的情况?

Boolean.TRUE == myBoolean;

Boolean.TRUE.equals(myBoolean);

我在这里不是在考虑原始类型,而是在考虑布尔对象。

【问题讨论】:

  • 你试过Boolean的多个实例吗?
  • myBoolean1 == myBoolean2 两者都相等?
  • 这就是我问这个问题的原因:Boolean a1 = true; Boolean a2 = true; System.out.println(a1 == a2);。输出为“真”

标签: java object boolean equals equality


【解决方案1】:

怎么样:

System.out.println(new Boolean(true) == new Boolean(true));
System.out.println(new Boolean(true) == Boolean.TRUE);

(对于the same reason as any other type of objects,两者都打印错误)。

【讨论】:

  • 为什么打印错误?你能解释一下吗?
  • new Boolean(true) == Boolean.TRUE 会更好地展示这个问题。
  • 它是假的,因为我们正在比较带有== 符号的对象?
  • @muneebShabbir 打印 false 的原因与任何其他对象相同:stackoverflow.com/questions/2772763/…
  • 谢谢...我不确定是否只有 2 个布尔对象并且所有引用都指向这些对象,但我猜不是
【解决方案2】:

使用== 会很危险,因为myBoolean 可能不是源自某个常量,而是构造为new Boolean(boolValue),在这种情况下== 将始终导致false。你可以只使用

myBoolean.booleanValue()

既不涉及== 也不涉及equals,提供可靠的结果。如果您还必须满足 null-values 的要求,那么没有什么比您的 equals 方法更好的了。

【讨论】:

  • 虽然这会导致返回原始值。
  • @Aquillo 你说得好像是个问题。为什么会有问题?请注意,任何一个 OP 表达式的结果都是相同的原始布尔值。
  • 对我来说,这将是一个可能的解决方案,而不是一个问题。尽管 OP 表示他的问题不是讨论基元的处理。
  • @MarkoTopolnik 原始值是三态布尔值的问题(真/假/空)
  • @Aquillo OP 仅表明 myBoolean 是一个对象。
【解决方案3】:

== 仅适用于原始类型
当你比较对象时,你应该总是使用o.equls(Object ob)

【讨论】:

  • 枚举除外。您可以将 == 用于 Enum 对象,因为 Java 保证它是单调的
【解决方案4】:
if (Boolean.TRUE == new Boolean(true)) {
    System.out.println("==");
}

if (Boolean.TRUE.equals(myBoolean)) {
    System.out.println("equals");
}

在这种情况下,第一个是假的。如果条件为真,则只有第二个。

它打印:

等于

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多