2012-06-06 3 views
3

클래스 Object의 인스턴스 값을 사용하여 클래스 형식의 개체를 클래스 형식의 다른 개체와 비교하려면 Object 클래스의 equals (Object) 메서드를 재정의하는 클래스를 작성했습니다.HashMap가 Object.equals를 호출하지 않습니까?

개체를 HashMap에 키로 넣은 다음지도에서 키와 동일한 개체 만 사용하여 get (Object)를 호출하면 null이 반환됩니다.

나는 equals 메서드에 새로운 동일한 개체를 전달하려고 시도했으며 true를 반환하므로 문제가 내 비교 코드가 아닙니다.

디버깅을 통해 수집 한 내용에서 내 개체의 equals (Object) 메서드가 호출되지 않습니다.

그러나 HashMap에서 String 키를 사용한 다음 동일한 문자를 사용하여 새 인스턴스를 get (Object)에 전달하면 값을 성공적으로 반환합니다.

왜 이런 일이 발생합니까? MY equals 메서드를 기반으로 HashMap 테스트 키를 사용하려면 어떻게해야합니까?

답변

10

Object.hashcode()도 무시해야합니다. hashcode()equals()HashTable ', HashMap'및 HashSet '에 올바른 기능을 보장하는 계약을 체결 했으므로 링크를 살펴보십시오.

HashMap에서 값은 키의 해시 코드가 도달하는 버킷에 저장됩니다. 적절한 버킷이 발견되면 동등성이 결정될 때까지 equals 메서드가 버킷의 각 멤버에 적용됩니다. 이 때문에 해시 알고리즘이 '해시가 잘되는지'확인하는 것이 중요합니다.

+0

그래서 hashCode()는 equals()가 true 인 경우 동일한 정수를 반환해야합니까? – bgroenks

+1

수정하십시오. 평등을 찾기 위해 'equals'가 사용하는 것과 동일한 멤버를 사용하여 해싱 알고리즘을 작성하는 것이 좋습니다. –

+0

정수가 무슨 상관입니까? Hashtables는 용량 및 부하율에 대해 2의 제곱을 사용합니까? – bgroenks

1

hashCode도 오버라이드해야합니다. 그렇지 않으면 HashMap (이름에서 알 수 있듯이)은 해시 콜렉션을 기반으로 한 동등성과 동일합니다. equals를 오버라이드 (override)하는 Java 「honor code」는, 동시에 hashCode를 오버라이드 (override) 할 필요가있는 것을 나타냅니다.

관련 문제