45

JDK中是否有一种方法可以比较两个对象是否相等,并考虑空值?像这样的东西:

public static boolean equals(Object o1, Object o2)
{
    if (o1 == null)
    {
        return o2 == null; // Two nulls are considered equal
    }
    else if (o2 == null)
    {
        return false;
    }

    return o1.equals(o2);
}

自己编写这种方法似乎很愚蠢,因为我认为它必须已经存在于某个地方。

4

7 回答 7

76

Java 7.0 添加了一个新的方便类:Objects.

它有一个方法来解决这个问题:Objects.equals(Object a, Object b)

于 2014-09-03T09:37:32.690 回答
17

Apache Commons Lang 有这样一个方法:ObjectUtils.equals(object1, object2)。您不希望在这种方法上使用泛型,它会导致虚假的编译错误,至少在一般使用中是这样。Equals 非常清楚(或者应该 - 它是合同的一部分)检查对象的类并返回 false,因此它不需要任何额外的类型安全。

于 2009-09-09T21:00:30.587 回答
16

FWIW,这是我的实现:

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

在我的应用程序中,我知道 a 和 b 将始终是相同的类型,但我怀疑即使它们不是,只要 a.equals() 得到合理实现,这也可以正常工作。

于 2012-02-15T22:56:49.013 回答
5
public static boolean equals(Object object1, Object object2) {
    if (object1 == null || object2 == null) {
        return object1 == object2;
    }
    return object1.equals(object2);
}
于 2012-12-20T19:16:20.683 回答
4

如果您担心 NullPointerExceptions,您可以测试相等性,例如:

if (obj1 != null && obj1.equals(obj2)) { ... }

的一般约定equals()是非空对象永远不应等于空引用,并且equals()如果您将对象与空引用进行比较(而不是抛出 NPE),则该方法应返回 false。

于 2009-09-09T20:56:47.510 回答
2

每当我遇到需求并认为“Java 必须拥有它如此普遍”但发现它没有时,我会查看 Jakarta Commons 项目。它几乎总是有它。快速搜索 commons-lang API(它具有最基本的常用实用程序)显示了equals()一种提供您想要的方法。

于 2009-09-09T21:01:08.683 回答
1

Jakarta Commons Lang API 有你正在寻找的东西ObjectUtils.equals(Object,Object)

于 2009-09-09T21:12:47.903 回答