2

如何实现这种相等比较是一种理智的 java 方式?

boolean x = (a == b) || (a.equals(b))

我想确保两个对象的内容相等,但 null 也可以,即两者都可以为 null,因此相等。

更新:为了清楚起见,我必须多次实施这种比较,并且不想每次都复制和粘贴这些东西,特别是对于长对象名称。使用 'a' 和 'b' 它看起来小而简单,但往往会增长......我想知道我是否缺少一些现有的 Java 功能。

4

9 回答 9

9

您可能想看看总是有用的Apache Commons Lang,更准确地说是ObjectUtils.equals()

于 2008-12-03T13:18:51.953 回答
8

另一种方法

boolean x = null==a ? null==b : a.equals(b);
于 2008-12-03T13:24:51.177 回答
5

如果 a 为 null 但 b 不是,会发生什么?我想你真的想要:

boolean x = (a == null && b == null) || (a != null && a.equals(b))

编辑:您可以为该类实现一个静态 NullEquals 方法,该方法采用该类的两个对象并按上述方式进行比较以避免重写并使代码更简洁。

public class MyClass {

    public static boolean NullEquals( MyClass a, MyClass b )
    {
         return (a == null && b == null) || (a != null && a.equals(b));
    }
}


if (MyClass.NullEquals(a,b))
{
    ...
}
于 2008-12-03T13:10:28.663 回答
5

典型的模式是:

if (a == b)
{
    return true;
}
if (a == null || b == null)
{
    return false;
}
// Now deal with a and b, knowing that they are non-identical, non-null references

是的,它很罗嗦——但如果你把它分成自己的方法,你可以把它放在合理的控制之下。

于 2008-12-03T13:15:42.817 回答
1

不是直接的答案,但是如果您有很多可以为空或不为空的对象,则可能表明您的代码存在问题。看一下Null Pattern,这是表示对象不存在的另一种方式

于 2008-12-03T13:49:15.683 回答
1

关于什么:

boolean x = equals( a, b );

public static boolean equals( Object a, Object b ) {
    if ( a == null && a == b ) {
        return true;
    } else {
        return a == b || a.equals( b );
    }
}

让我看看。

  • 如果 a 为空且 a 为 b 则没关系
  • 如果 a 不为空,则如果 a == b(相同的 ref)通过短路返回 true
  • 如果 a 不是 b (OR 的 2dns 部分可能 b 为 null )则返回 a (不为 null ) .equals( b ) 无论 b 是什么

是的。

于 2008-12-04T01:30:31.867 回答
0

最常见的做法是:

a==null ? b==null : a.equals(b)

一个可能稍微更有效但不太清晰的表达式是:

a==b || (a!=null && a.equals(b))

你当然可以把它放在一个方法中:

public static boolean eq(Object a, Object b) {
     return a==b || (a!=null && a.equals(b));
}

如果 a 为空且 b 为非空,请注意原始问题代码 NPE。

于 2008-12-03T14:54:02.463 回答
0

无法添加评论,将此视为对Jon Skeet答案的评论。

在 Java 中 Null = Null 是真还是假。

更具体地说,什么应该是 Null = Null 应该被处理,以及不同的语言如何以及为什么处理这种情况?

于 2008-12-03T13:57:04.543 回答
0

出于性能原因,通常最好在执行任何其他逻辑之前检查身份,就像问题中所做的那样。但是,许多答案都没有考虑到这一点。

进行身份检查的最佳位置是在equals您的类上实现该方法:

public boolean equals(Object obj) {
  if(this == obj) return true;
  ...
}

如果这已经/可以做到,您可以轻松进行比较:

a == null ? b == null : a.equals(b);

否则,您可能必须自己检查身份:

a == null ? b == null : (a == b || a.equals(b));
于 2008-12-04T01:07:55.827 回答