平等比较 - 任何更健全的方式?

时间:2008-12-03 13:06:17

标签: java comparison

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

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

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

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

9 个答案:

答案 0 :(得分:9)

您可能希望查看始终有用的Apache Commons Lang,更准确地说ObjectUtils.equals()

答案 1 :(得分:8)

另一种方法

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

答案 2 :(得分: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))
{
    ...
}

答案 3 :(得分: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

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

答案 4 :(得分:1)

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

答案 5 :(得分: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为null且a为b,则表示没问题
  • 如果a不为null,则a == b(相同的ref)通过shortcircuit返回true
  • 如果a不是b(OR的2dns部分可能是b为空)则返回a(非null).equals(b)无论b是什么

Yeap覆盖。

答案 6 :(得分:0)

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

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

更具体地说应该处理Null = Null以及不同语言处理这种情况的方式和原因?

答案 7 :(得分: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为null且b为非null,请注意原始问题代码NPE。

答案 8 :(得分: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));