2012-06-28 1 views
1

저는 현재 사용자 정의 객체 유형의 데이터 구조로 구성된 여러 필드가있는 동일한 유형의 두 개의 복잡한 객체를 비교하려고합니다. 어떤 사용자 정의 객체도 hashCode() 메소드를 오버라이드하지 않았다고 가정하면, 객체의 모든 필드의 해시 코드를 비교하면 동일한 것으로 판명 될 것입니다. 비교 대상의 컨텐츠가 100 % 확실하다는 확신이 있습니까? 똑같다? 그렇지 않다면 두 가지 객체를 비교하는 것이 좋습니다. 외부 라이브러리를 사용할 수 없다고 가정하면됩니다.자바 hashCode() 메서드는 객체 평등의 신뢰할 수있는 척도입니까?

답변

8

절대적으로 아닙니다. 만 첫 번째 패스로 hashCode()을 사용해야합니다. 해시 코드가 다른 경우 객체가 서로 다른 것으로 가정 할 수 있습니다. 해시 코드가 같으면 ,을 호출하면 equals()을 호출하여 완전한 평등을 확인할 수 있습니다.

이런 식으로 생각하면됩니다 : 가능한 해시 코드가 있습니다. 얼마나 많은 가능한 객체가 있습니까? 예를 들어 String 유형이 있습니까? 그 이상. 따라서 적어도 두 개의이 아닌 동일한 문자열은 동일한 해시 코드를 공유해야합니다.

Eric Lippert writes well about hash codes - .NET 관점에서 보면 그렇지만 원칙은 동일합니다.

+0

안녕하세요. 그렇다면 70 개가 넘는 클래스 필드에 대해 equals 메소드를 작성해야하며, 그 중 다수가 맞춤 객체의 데이터 구조입니다. 그 주위에 다른 방법은 없습니까? – LucasSeveryn

+3

비교 대상인 두 객체가 70 개 필드가 모두 같을 경우에만 동일한 것으로 간주되는 경우에는 그 둘레에 절대적으로 다른 방법이 없습니다. 이클립스와 같은 IDE는 자동으로'hashCode'와'equals' 메쏘드를 생성 할 수 있습니다. – Jesper

+0

작은 객체의 경우 해시 코드를 사용하여 아무 것도 얻지 못합니까? – BlueSky

2

아니, hashCode() 충돌의 부족이 개체 만 동일 할 수 있다는 것을 의미, 그것은 결코 보증을합니다.

유일한 보증은 hashCode() 값이 다른 (그리고 hashCode()/equals() 구현이 정확한지)이면 개체 equal이어야한다는 것이다. 사용자 정의 유형이 hashCode() 구현이없는 경우는 identityHashCode()되기 때문에

은 또한, 그 값은 객체의 내용을 비교 완전히 쓸모 입니다.

0

hashCode() 메서드를 재정의하지 않은 경우 모든 개체가 동일하지 않습니다. 이를 재정 의하여 비교 논리를 제공합니다. hashCode()를 재정의하는 경우 반드시 equals()을 재정의해야합니다. 편집 : 여전히 충돌이있을 수 있지만 equal()을 덮어 쓰지 않으면 개체가 참조 (개체가 자체와 동일)로 비교됩니다.

0

Object.hashCode()의 일반적인 JVM 구현은 어떤 형식으로 객체의 메모리 주소를 반환하는 것이므로 두 개의 객체가 같은 주소를 공유 할 수 없기 때문에 원하는대로 기술적으로 사용됩니다.

그러나 실제로는 Object.hashCode()은 아무런 의미가 없으므로 현명한 코드 또는 잘 쓰여진 코드에서이 목적으로 사용해서는 안됩니다.

Apache Commons 라이브러리에서 사용할 수있는 hashCode 및 equals 빌더를 사용하거나 정말로 자유로운 외부 라이브러리를 사용할 수없는 경우 영감을 얻기 위해 추천합니다. 가장 좋은 방법은 응용 프로그램 도메인의 컨텍스트에서 실제로 "동등한"것이 무엇을 의미하는지에 달려 있습니다.