比较两个对象并检查null

时间:2009-09-09 20:54:28

标签: comparison null equals java

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);
}

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

7 个答案:

答案 0 :(得分:67)

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

它有一个完全适用于此的方法:Objects.equals(Object a, Object b)

答案 1 :(得分:17)

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

答案 2 :(得分:15)

FWIW,这是我的实施:

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

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

答案 3 :(得分:5)

public static boolean equals(Object object1, Object object2) {
    if (object1 == null || object2 == null) {
        return object1 == object2;
    }
    return object1.equals(object2);
}

答案 4 :(得分:4)

如果您担心NullPointerExceptions,您可以测试等式:

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

equals()的一般契约是非空对象永远不应该等于空引用,如果要将对象与空引用进行比较,equals()方法应该返回false (而不是扔NPE)。

答案 5 :(得分:2)

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

答案 6 :(得分:1)