[java] Java의 두 객체를 가능한 null 값과 비교

Java에서 두 문자열이 동일한 지 비교하고 싶습니다. 둘 중 하나 또는 둘 다 일 수 있으므로 null간단히 호출 할 수 없습니다 .equals(). 가장 좋은 방법은 무엇입니까?

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

편집하다:

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



답변

이것은 Java 내부 코드가 다른 compare방법으로 사용하는 것입니다 .

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


답변

Java 7부터는 정적 메소드 java.util.Objects.equals(Object, Object)를 사용하여 두 오브젝트에 대해 걱정하지 않고 두 오브젝트에 대해 동등 검사를 수행 할 수 있습니다 null.

두 객체가 모두 null반환 true되면 하나가 반환 null되고 다른 객체가 그렇지 않으면 반환 false됩니다. 그렇지 않으면 equals첫 번째 객체를 호출 한 결과를 두 번째 인자로 반환합니다 .


답변

이러한 경우 Apache Commons StringUtils # equals 를 사용하는 것이 좋으며 이미 널 문자열을 처리합니다. 코드 샘플 :

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

라이브러리를 추가하지 않으려면 메소드 의 소스 코드 를 복사하여 StringUtils#equals필요할 때 적용하십시오.


답변

API 19의 Objects.equals (str1, str2)를 사용할 수없는 안드로이드 사용자에게는 다음이 있습니다.

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

null 안전합니다. 안드로이드의 동일한 문자열이 안드로이드의 String Pooling 덕분에 “==”피연산자와 거의 항상 true를 비교 하고 길이 검사는 대부분의 불일치를 필터링하는 빠른 방법이기 때문에 더 비싼 string.equals () 메소드를 사용하는 경우는 거의 없습니다 .

소스 코드:

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


답변

버전 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)

이것들은 null 안전 문자열 비교를 제공합니다.


답변

사용 자바 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);
}


답변

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