2010-05-07 2 views
2

다음과 같은 상황이 있습니다. 높이를 기준으로 트리를 정렬해야하므로 height 특성을 사용하여 Tree를 비교할 수 있습니다. 그러나 예측할 수없는 동작을 피하기 위해 equals 및 hashCode 메서드를 덮어 씁니다.Java : .equals 메소드를 덮어 쓰는 경우에도 ==를 사용하여 참조 동등성을 테스트 할 수 있습니까?

그래도 때로는 ==를 사용하여 그 라인을 따라 뿌리 또는 무언가의 참조를 비교할 수 있습니다. 여전히 가능합니까? 아니면 == 비교가 equals 메서드를 호출합니까?

+0

s/overwrite/override/p –

답변

3

예, ==은 hashCode 또는 같음을 호출하지 않습니다. 이와 같이 참조 평등을 테스트 할 수 있습니다.

0

==은 equals를 호출하지 않습니다. 따라서 ID 확인을 위해 여전히 찾습니다.

equals의 많은 구현이 this == other으로 시작하므로 뒤에서 equals을 호출하는 경우 리터럴 StackOverflow가 표시되는지 확인하십시오.

0

== 테스트 동등성. 그것은 equals를 호출하지 않습니다.

7

equals()은 개체를 프로그래머가 설정 한 규칙과 비교하기위한 것입니다. 귀하의 예에서는 높이를 기준으로 나무를 비교하므로 높이를 비교하여 equals()으로 작성합니다.

==은 언급 한 것처럼 비교합니다. 이들은 equals() 또는 hashCode()에 의해 만져지지 않습니다. 그래서 당신은 행동을 바꾸지 않을 것입니다.

1

equals() 메서드를 재정의하면 == 연산자에 영향을주지 않습니다. ==는 2 개의 참조가 동일한 객체를 가리키는 지 테스트하는 데 사용됩니다. equals() 메서드 "meaningfully"는 2 개의 개체를 비교합니다.

"의미있는"작품의 의미를 이해하는 것이 중요합니다. 예를 들어 2 문자열 또는 2 정수와 비교할 때 평등을 더 쉽게 이해할 수 있습니다. 이것이 Object 클래스에서 상속 된 equals() 메서드가 String 클래스와 Wrapper 클래스 (Integer, Float 등)에 의해 이미 오버 라이드 된 이유입니다. 그러나 Song 유형의 객체 두 개를 비교하는 경우에는 어떻게됩니까? 여기에서, 평등의 기초 확립 될 수
1) 아티스트 이름
2) 노래 이름
3) 또는 다른 기준

따라서 "명시 적으로"결정() 메소드를 등호를 재정의해야 "언제"2 곡의 대상이 동등한 것으로 간주됩니다.

질문에서 언급 한 "예기치 않은 동작"은지도와 같은 컬렉션을 처리 할 때 위의 (노래)와 같은 개체와 관련이 있습니다. equals()와 hashcode() 메소드를 오버라이드 (override) 할 때까지, 맵 내의 이러한 객체를 사용하지 말아주세요. 해시 맵 검색 및 색인 생성이 작동하는 이유. 특정 규칙에 대해서는 JavaDoc을 참조하십시오. 기억해야 할 것은 다음과 같습니다.
2 개의 객체가 의미 상으로 같으면 해시 코드는 동일한 값을 반환해야합니다. 그러나 동일한 해시 코드를 반환하는 경우 2 개의 객체가 같을 필요는 없습니다. 다시 말하지만 Java는 이와 관련하여 어떠한 규칙도 시행하지 않습니다. equals() 및 hashcode() 메서드를 올바르게 구현하는 것은 사용자의 책임입니다.

1

더 큰 질문은이 객체에 비교 가능을 구현하는 것이 적절한 지 여부입니다.높이에서 작동하는 연산에 대해 Comparator를 사용하고 클래스 자체에 서수 계산을 포함시키지 않는 것이 더 적절할 수 있습니다.

내 일반적인 철학은 개체에 대한 자연스러운 순서가있는 경우에만 Comparable을 구현하는 것입니다. 트리 노드의 경우 높이가 인 경우 누구나 정렬 할 수 있습니다. 어쩌면 이것은 개인 수업이고, 대답은 '예'입니다. 하지만 그때조차도 Comparator를 만드는 것은 그리 많은 추가 작업이 아니며 언젠가는 해당 트리 노드를 언젠가는 보호되거나 공개 된 클래스로 만들고자하는 경우를 대비하여 유연하게 만듭니다.