저는 현재 사용자 정의 객체 유형의 데이터 구조로 구성된 여러 필드가있는 동일한 유형의 두 개의 복잡한 객체를 비교하려고합니다. 어떤 사용자 정의 객체도 hashCode()
메소드를 오버라이드하지 않았다고 가정하면, 객체의 모든 필드의 해시 코드를 비교하면 동일한 것으로 판명 될 것입니다. 비교 대상의 컨텐츠가 100 % 확실하다는 확신이 있습니까? 똑같다? 그렇지 않다면 두 가지 객체를 비교하는 것이 좋습니다. 외부 라이브러리를 사용할 수 없다고 가정하면됩니다.자바 hashCode() 메서드는 객체 평등의 신뢰할 수있는 척도입니까?
답변
절대적으로 아닙니다. 만 첫 번째 패스로 hashCode()
을 사용해야합니다. 해시 코드가 다른 경우 객체가 서로 다른 것으로 가정 할 수 있습니다. 해시 코드가 같으면 ,을 호출하면 equals()
을 호출하여 완전한 평등을 확인할 수 있습니다.
이런 식으로 생각하면됩니다 : 가능한 해시 코드가 있습니다. 얼마나 많은 가능한 객체가 있습니까? 예를 들어 String
유형이 있습니까? 그 이상. 따라서 적어도 두 개의이 아닌 동일한 문자열은 동일한 해시 코드를 공유해야합니다.
Eric Lippert writes well about hash codes - .NET 관점에서 보면 그렇지만 원칙은 동일합니다.
아니, hashCode()
충돌의 부족이 개체 만 이 동일 할 수 있다는 것을 의미, 그것은 결코 보증을합니다.
유일한 보증은 hashCode()
값이 다른 (그리고 hashCode()
/equals()
구현이 정확한지)이면 개체 equal
이어야한다는 것이다. 사용자 정의 유형이 hashCode()
구현이없는 경우는 identityHashCode()
되기 때문에
hashCode()
메서드를 재정의하지 않은 경우 모든 개체가 동일하지 않습니다. 이를 재정 의하여 비교 논리를 제공합니다. hashCode()를 재정의하는 경우 반드시 equals()
을 재정의해야합니다. 편집 : 여전히 충돌이있을 수 있지만 equal()
을 덮어 쓰지 않으면 개체가 참조 (개체가 자체와 동일)로 비교됩니다.
Object.hashCode()
의 일반적인 JVM 구현은 어떤 형식으로 객체의 메모리 주소를 반환하는 것이므로 두 개의 객체가 같은 주소를 공유 할 수 없기 때문에 원하는대로 기술적으로 사용됩니다.
그러나 실제로는 Object.hashCode()
은 아무런 의미가 없으므로 현명한 코드 또는 잘 쓰여진 코드에서이 목적으로 사용해서는 안됩니다.
Apache Commons 라이브러리에서 사용할 수있는 hashCode 및 equals 빌더를 사용하거나 정말로 자유로운 외부 라이브러리를 사용할 수없는 경우 영감을 얻기 위해 추천합니다. 가장 좋은 방법은 응용 프로그램 도메인의 컨텍스트에서 실제로 "동등한"것이 무엇을 의미하는지에 달려 있습니다.
안녕하세요. 그렇다면 70 개가 넘는 클래스 필드에 대해 equals 메소드를 작성해야하며, 그 중 다수가 맞춤 객체의 데이터 구조입니다. 그 주위에 다른 방법은 없습니까? – LucasSeveryn
비교 대상인 두 객체가 70 개 필드가 모두 같을 경우에만 동일한 것으로 간주되는 경우에는 그 둘레에 절대적으로 다른 방법이 없습니다. 이클립스와 같은 IDE는 자동으로'hashCode'와'equals' 메쏘드를 생성 할 수 있습니다. – Jesper
작은 객체의 경우 해시 코드를 사용하여 아무 것도 얻지 못합니까? – BlueSky