将Java中的两个对象与可能的空值进行比较

时间:2012-06-30 04:58:48

标签: java null equality

我想在Java中比较两个字符串的相等性,当其中一个或两者都是null时,我不能简单地调用.equals()。什么是最好的方式?

boolean compare(String str1, String str2) {
    ...
}

编辑:

return ((str1 == str2) || (str1 != null && str1.equals(str2)));

12 个答案:

答案 0 :(得分:214)

从Java 7开始,您可以使用静态方法Objects.equals(Object, Object)对两个对象执行equals检查,而不必关注它们null

如果两个对象都是null,则会返回true,如果一个是null而另一个不是,则会返回false。否则,它将返回第一个对象上调用equals的结果,第二个作为参数。

答案 1 :(得分:152)

这是Java内部代码使用的(在其他compare方法上):

public static boolean compare(String str1, String str2) {
    return (str1 == null ? str2 == null : str1.equals(str2));
}

答案 2 :(得分:38)

对于这些情况,最好使用Apache Commons StringUtils#equals,它已经处理了空字符串。代码示例:

public boolean compare(String s1, String s2) {
    return StringUtils.equals(s1, s2);
}

如果您不想添加库,只需复制StringUtils#equals方法的source code并在需要时应用它。

答案 3 :(得分:25)

对于那些不能使用API​​ 19的Objects.equals(str1,str2)的android,有这样的:

android.text.TextUtils.equals(str1, str2);

它是安全的。它很少使用更昂贵的string.equals()方法,因为android上的相同字符串几乎总是与“==”操作数比较,感谢Android's String Pooling,并且长度检查是过滤掉大多数不匹配的快速方法

源代码:

/**
 * Returns true if a and b are equal, including if they are both null.
 * <p><i>Note: In platform versions 1.1 and earlier, this method only worked  well if
 * both the arguments were instances of String.</i></p>
 * @param a first CharSequence to check
 * @param b second CharSequence to check
 * @return true if a and b are equal
 */
public static boolean equals(CharSequence a, CharSequence b) {
    if (a == b) return true;
    int length;
    if (a != null && b != null && (length = a.length()) == b.length()) {
        if (a instanceof String && b instanceof String) {
            return a.equals(b);
        } else {
            for (int i = 0; i < length; i++) {
                if (a.charAt(i) != b.charAt(i)) return false;
            }
            return true;
        }
    }
    return false;
}

答案 4 :(得分:7)

从版本3.5开始,Apache Commons StringUtils具有以下方法:

static int  compare(String str1, String str2)
static int  compare(String str1, String str2, boolean nullIsLess)
static int  compareIgnoreCase(String str1, String str2)
static int  compareIgnoreCase(String str1, String str2, boolean nullIsLess)

这些提供了空安全字符串比较。

答案 5 :(得分:3)

使用Apache Commons StringUtils类的equals( - , - )和equalsIgnoreCase( - , - )方法比较两个字符串。

StringUtils.equals( - , - )

StringUtils.equals(null, null)   = true
StringUtils.equals(null, "abc")  = false
StringUtils.equals("abc", null)  = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false

StringUtils.equalsIgnoreCase( - , - )

StringUtils.equalsIgnoreCase(null, null)   = true
StringUtils.equalsIgnoreCase(null, "abc")  = false
StringUtils.equalsIgnoreCase("xyz", null)  = false
StringUtils.equalsIgnoreCase("xyz", "xyz") = true
StringUtils.equalsIgnoreCase("xyz", "XYZ") = true

答案 6 :(得分:2)

boolean compare(String str1, String str2) {
    if(str1==null || str2==null) {
        //return false; if you assume null not equal to null
        return str1==str2;
    }
    return str1.equals(str2);
}

这是你想要的吗?

答案 7 :(得分:2)

使用 Java 8:

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIKpAuZ/Wwp7FTSCNJ56fFM4Y/rf8ltXp3xnrooPxNc1UoAoGCCqGSM49
AwEHoUQDQgAEqiRaEw3ItPsRAqdDjJCyqxhfm8y3tVrxLBAGhPM0pVhHuqmPoQFA
zR5FA3IJZaWcopieEX5uZ4KMtDhLFu/FHw==
-----END EC PRIVATE KEY-----

答案 8 :(得分:1)

boolean compare(String str1, String str2) {
    if (str1 == null || str2 == null)
        return str1 == str2;

    return str1.equals(str2);
}

答案 9 :(得分:1)

boolean compare(String str1, String str2) {
  return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}

答案 10 :(得分:1)

您可以使用以下java.util.Objects

public static boolean compare(String str1, String str2) {
    return Objects.equals(str1, str2);
}

答案 11 :(得分:0)

好的,那么&#34;最好的解决方案&#34;意思?

如果您的意思是最具可读性,那么对于经验丰富的Java程序员来说,所有可能的解决方案都非常相同。但IMO最具可读性的是

 public boolean compareStringsOrNulls(String str1, String str2) {
     // Implement it how you like
 }

换句话说,将实现隐藏在一个简单的方法中(理想情况下)可以内联。

(您也可以&#34; out-source&#34;到第三方实用程序库......如果您已在代码库中使用它。)


如果你的意思是性能最好,那么:

  1. 最高性能的解决方案取决于平台和上下文,
  2. 其中一个&#34; context&#34;问题是null参数的相对(动态)发生频率,
  3. 可能并不重要哪个版本更快......因为差异可能太小而无法改变整体应用程序的性能,
  4. 如果它确实重要,找出你的平台最快的唯一方法就是尝试两种版本并测量差异。