source

Java의 두 개체를 가능한 null 값과 비교합니다.

factcode 2022. 9. 1. 23:11
반응형

Java의 두 개체를 가능한 null 값과 비교합니다.

이 동등하게 있는 .null.

그냥 수 요..equals()「」를할 수 에,null★★★★★★ 。

지금까지 시도한 코드는 다음과 같습니다.

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

으로 모든 할 수 요?null

Java 7에서는 스태틱 방식을 사용하여 2개의 오브젝트에 대해 동등한 체크를 실행할 수 있기 때문에 이들 오브젝트가 어떤 상태에 있는지 신경 쓰지 않습니다.null.

가 " " " 인 null은 돌아올 것이다true가 ''인null 또 것은 그것이 것이다.false그렇지 않으면 첫 번째 개체를 호출한 결과를 반환하고 두 번째 개체를 인수로 반환합니다.

은, 코드( 「Java」의 경우가 사용하는 것입니다.compare( 드 : 。

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

이러한 경우 Apache Commons String Utils #equals사용하는 것이 좋습니다.이러한 경우 null 문자열은 이미 처리됩니다.코드 샘플:

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

라이브러리를 추가하지 않으려면 의 소스 코드를 복사하기만 하면 됩니다.StringUtils#equals필요할 때 적용할 수 있습니다.

API 19의 Objects.equals(str1, str2)를 사용할 수 없는 Android 사용자에게는 다음과 같은 것이 있습니다.

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

null safe입니다.Android의 String Pooling 덕분에 거의 항상 "==" 피연산자와 동일한 문자열이 비교되고, 길이 확인은 대부분의 불일치를 빠르게 걸러낼 수 있는 방법이기 때문에 더 비싼 string.disclos() 메서드를 사용할 필요가 거의 없습니다.

소스 코드:

/**
 * 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 String Utils에는 다음과 같은 메서드가 있습니다.

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 safe String 비교를 제공합니다.

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

또는 Java를 사용하여 아래 방법을 사용할 수도 있습니다.

공용 정적 부울 비교(String first, String second) {return(Objects.isNull(첫 번째) ? Objects.isNull(두 번째) : first.equals(두 번째);}

equals(-)와 equals를 사용하여 두 문자열을 비교합니다.Apache Commons StringUtils 클래스의 IgnoreCase(-) 메서드입니다.

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

String Utils.equalsIgnore Case(-, -):

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

하시면 됩니다.java.util.Objects다음과 같이 합니다.

public static boolean compare(String str1, String str2) {
    return Objects.equals(str1, str2);
}
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);
}

이게 네가 원했던 거야?

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

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

그렇다면 "최상의 솔루션"이란 무엇일까요?

가장 읽기 쉬운 것을 의미한다면 경험 많은 Java 프로그래머에게 가능한 모든 솔루션은 거의 동일합니다.하지만 IMO가 가장 읽기 쉬운 것은 이것이다.

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

즉, (이상적으로) 삽입할 수 있는 간단한 방법 안에 구현을 숨깁니다.

(서드파티제의 유틸리티 라이브러리에 「아웃소스」할 수도 있습니다.이미 코드 베이스로 사용하고 있는 경우).


퍼포먼스가 가장 뛰어난 경우:

  1. 가장 뛰어난 솔루션은 플랫폼과 상황에 따라 달라집니다.
  2. '위험한' 문제의 하나는 발생 빈도의 상대적(동적)이다.null논쟁들,
  3. 어떤 버전이 더 빠른지는 중요하지 않을 것입니다. 왜냐하면 전체 애플리케이션 성능에 영향을 미치기에는 차이가 너무 작을 수 있기 때문입니다.
  4. 문제가 될 경우 플랫폼에서 가장 빠른 버전을 찾는 유일한 방법은 두 버전을 모두 사용해 보고 차이를 측정하는 것입니다.

언급URL : https://stackoverflow.com/questions/11271554/compare-two-objects-in-java-with-possible-null-values

반응형