在Java中比较两个对象有可能的空值在Java中比较两个对象有可能的空值(Compare two o

2019-06-14 10:26发布

我想比较在Java平等,当一个或两个可能是两个字符串null ,所以我不能简单地调用.equals() 什么是最好的方法?

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

编辑:

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

Answer 1:

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

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


Answer 2:

由于Java 7,您可以使用静态方法Objects.equals(Object, Object)来执行等于在两个物体的检查,而无需关心他们是null

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



Answer 3:

对于这些情况可能会更好使用Apache的百科全书 StringUtils的#等于 ,它已经处理空字符串。 代码示例:

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

如果你不希望添加库,刚才复制的源代码的StringUtils#equals方法,当你需要它运用它。



Answer 4:

对于那些在Android上,谁不能使用API​​ 19的Objects.equals(STR1,STR2),有这样的:

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

这是空安全。 它很少具有使用更昂贵的string.equals()方法,因为在Android相同的字符串几乎总是比较“==”操作由于与真正的Android的字符串池 ,和长度检查是过滤掉大部分不匹配的快捷方式。

源代码:

/**
 * 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;
}


Answer 5:

由于3.5版本的Apache下议院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)

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



Answer 6:

比较两个字符串,用平等( - , - )和equalsIgnoreCase( - , - )阿帕奇百科全书StringUtils类的方法。

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


Answer 7:

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

这是你想要的是什么?



Answer 8:

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

    return str1.equals(str2);
}


Answer 9:

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


Answer 10:

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

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


Answer 11:

使用Java 8:

private static Comparator<String> nullSafeStringComparator = Comparator
        .nullsFirst(String::compareToIgnoreCase); 

private static Comparator<Metadata> metadataComparator = Comparator
        .comparing(Metadata::getName, nullSafeStringComparator)
        .thenComparing(Metadata::getValue, nullSafeStringComparator);

public int compareTo(Metadata that) {
    return metadataComparator.compare(this, that);
}


Answer 12:

好了,什么是“最佳解决方案”是什么意思?

如果你的意思是最可读的,那么所有可能的解决方案是一个有经验的Java程序员几乎等同。 但IMO最可读的是这样的

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

换言之,隐藏(理想情况下)可以被内联的简单方法内执行。

(你也可以“外源”的第三方工具库...如果你已经在使用它的代码库。)


如果你的意思是最高效的,则:

  1. 最高效的解决方案取决于平台和语境上,
  2. 的“上下文”的问题之一是出现的相对(动态)频率null参数,
  3. 可能并不重要版本更快......因为差异可能太小,使整体应用性能的差异,
  4. 如果这非常重要,只有这样,才能弄清楚这是最快的基于使用的平台是尝试两个版本,并测量差异。


文章来源: Compare two objects in Java with possible null values