[java] compareTo () 대 equals ()
String
Java에서의 동등성을 테스트 할 때 나는 equals()
이것이 가장 자연스러운 방법 인 것처럼 보이기 때문에 항상 사용 했습니다. 결국 그 이름은 이미 의도 한 바를 말하고 있습니다. 그러나 최근에 동료 compareTo() == 0
가 equals()
. 이것은 부자연스럽고 ( compareTo()
순서를 제공하고 평등을 비교하지 않기위한 것이므로) 다소 위험하다고 느껴집니다 (왜냐하면 compareTo() == 0
모든 경우에 평등을 의미하지는 않기 때문입니다 String
).
그가 사용하는 배웠습니다 그는 왜 몰랐 compareTo()
대신 equals()
에 String
의, 나는 또한 어떤 이유를 찾을 수 없습니다. 이것은 정말로 개인적인 취향의 문제입니까, 아니면 두 방법 모두에 대한 진정한 이유가 있습니까?
답변
차이점은 NullPointerException "foo".equals((String)null)
을 "foo".compareTo((String)null) == 0
throw하는 동안 false 를 반환 한다는 것 입니다. 따라서 문자열에서도 항상 교환 할 수있는 것은 아닙니다.
답변
두 가지 주요 차이점은 다음과 같습니다.
equals
모든 개체를 매개 변수로 사용하지만compareTo
문자열 만 사용합니다.equals
동일한 지 여부 만 알려주지 만compareTo
문자열이 사 전적으로 비교되는 방법에 대한 정보를 제공합니다.
String 클래스 코드를 살펴 보았고 compareTo 및 equals 내의 알고리즘은 기본적으로 동일하게 보입니다. 나는 그의 의견이 단지 취향의 문제라고 믿고, 나는 당신에게 동의합니다. 만약 당신이 알아야 할 모든 것이 Strings의 평등이고 어떤 것이 어휘 학적으로 먼저 오는 것이 아니라면, 나는 equals
.
답변
평등을 비교할 때는 equals()
의도를 분명하게 표현하기 때문에 를 사용해야합니다 .
compareTo()
Comparable
인터페이스 를 구현하는 객체에서만 작동한다는 추가 단점이 있습니다.
이것은 문자열뿐만 아니라 일반적으로 적용됩니다.
답변
compareTo
문자열의 길이가 다른 경우 더 많은 작업을 수행합니다. equals
false를 반환 compareTo
할 수 있지만 정렬 순서를 찾기 위해 항상 충분한 문자를 검사해야합니다.
답변
compareTo()
compareTo<T>
일반 인수를 취하기 때문에 문자열뿐만 아니라 다른 모든 객체에도 적용됩니다 T
. String은 다음을 구현하여 compareTo()
메서드를 구현 한 클래스 중 하나입니다 .Comparable
인터페이스를 . (compareTo ()는 유사한 인터페이스를위한 메서드입니다). 따라서 모든 클래스는 Comparable 인터페이스를 자유롭게 구현할 수 있습니다.
그러나compareTo()
일반적으로 오름차순 또는 내림차순으로 객체를 정렬하는 데 사용되는 객체의 순서를 제공하며 equals()
평등에 대해서만 이야기하고 동일한 지 여부를 말합니다.
답변
문자열 컨텍스트에서 :
compareTo : 두 문자열을 사 전적으로 비교합니다.
같음 :이 문자열을 지정된 개체와 비교합니다.
compareTo는 두 문자열을 문자 (동일한 인덱스)로 비교하고 그에 따라 정수 (양수 또는 음수)를 반환합니다.
String s1 = "ab";
String s2 = "ab";
String s3 = "qb";
s1.compareTo(s2); // is 0
s1.compareTo(s3); // is -16
s3.compareTo(s1); // is 16
답변
equals () 는 compareTo () 보다 더 효율적일 수 있습니다 .
compareTo와 equals의 매우 중요한 차이점 :
"myString".compareTo(null); //Throws java.lang.NullPointerException
"myString".equals(null); //Returns false
equals () 는 두 객체가 동일한 지 확인하고 부울을 반환합니다.
compareTo () (Comparable 인터페이스에서) 정수를 반환합니다. 두 개체 중 어떤 개체가 다른 개체보다 “작거나”, “같거나” “큰지”확인합니다. 모든 객체를 논리적으로 정렬 할 수있는 것은 아니므로 compareTo () 메서드가 항상 의미가있는 것은 아닙니다.
equals ()는 compareTo ()가하는 객체 사이의 순서를 정의하지 않습니다.
이제 두 방법의 소스 코드를 검토하여 일부 수학 계산이 포함 된 compareTo보다 equals가 더 낫다는 결론을 내리는 것이 좋습니다.