답변:
이것은 Java 내부 코드가 다른 compare
방법으로 사용하는 것입니다 .
public static boolean compare(String str1, String str2) {
return (str1 == null ? str2 == null : str1.equals(str2));
}
<0
, ==0
또는 >0
하나가 다른 것보다 낮은 / 강판 인 나타냅니다
Objects.equals(Object, Object)
Mark Rotteveel이 그의 답변에서 지적한대로 사용 하는 것이 좋습니다 (공개하십시오)
Java 7부터는 정적 메소드 java.util.Objects.equals(Object, Object)
를 사용하여 두 오브젝트에 대해 걱정하지 않고 두 오브젝트에 대해 동등 검사를 수행 할 수 있습니다 null
.
두 객체가 모두 null
반환 true
되면 하나가 반환 null
되고 다른 객체가 그렇지 않으면 반환 false
됩니다. 그렇지 않으면 equals
첫 번째 객체를 호출 한 결과를 두 번째 인자로 반환합니다 .
Object.equals(Object)
컴파일 시간 유형 검사가 없습니다. 은 Objects.equals(Object, Object)
매우 정상적인와 동일하게 작동 equals
, 다시 추론 / IDE에 의해 검사, 그 규칙도 지원됩니다 추론이다 Objects.equals(Object, Object)
(예를 들면하게 IntelliJ IDEA 2016.2 일반 등호와 객체의 하나 모두 같은 검사가 있습니다).
이러한 경우 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
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);
}
이것이 당신이 원하는 것입니까?
false
두 문자열 모두 null
원하는 결과가 아닐 수 있습니다.
그렇다면 "최상의 솔루션"이란 무엇입니까?
가장 읽기 쉬운 것을 의미한다면, 가능한 모든 솔루션은 숙련 된 Java 프로그래머와 거의 동일합니다. 하지만 가장 읽기 쉬운 IMO는
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
다시 말해, (이상적으로) 인라인 될 수있는 간단한 메소드 안에 구현을 숨 깁니다.
(코드베이스에서 이미 사용중인 경우 타사 유틸리티 라이브러리에 "아웃소싱"할 수도 있습니다.)
가장 성능이 좋다면 다음을 수행하십시오.
null
인수 발생의 상대적 (동적) 빈도입니다 .