2014-12-09 8 views
0

equalshashCode 메소드 간의 계약을 이해합니다. equals이 무시되면 hashCode도되어야합니다. hashCode 메서드를 오버라이드 (override) 해, 항상 같은 값을 돌려 줄 수가 있습니까? hashCode 메서드를 재정 의하여 호출 할 때마다 임의의 숫자를 반환 할 수 있습니까?equals 및 hashCode에 대한 추가 정보

+2

** Can ** you? 확실한. 하지만 그렇게했다면 어떻게 될까요? –

+0

그런 질문을하는 경우 반드시 계약을 다시 읽어야합니다. 해시 코드와 같음은 같은 동전의 두 얼굴입니다. 어느 쪽도 다른 사람 없이는 완전한 감각을 갖지 못합니다. 500 줄을 써 줄 수는 있지만, 더 잘 배우려면 스스로 알아야합니다. – Nazgul

+0

상수 또는 무작위 int를 반환하도록 hashCode를 재정의하면 컴파일러는 당황하거나 불평하지 않았습니다. 이 사실이 궁금한데 왜 이것이 권고가되지 않는 이유입니까? HashSet, HashMap ..의 더 큰 그림을 그리워했습니다. Hashing에 의존합니다. – Keerthi

답변

5

임의 값을 반환하려면 hashCode을 재정의해서는 안됩니다. 같은 인스턴스에 대해 항상 동일한 값을 반환해야합니다.

명확하게 Javadoc에 명시되어 Java 어플리케이션의 실행 중에 같은 객체에서 호출 될 때마다

는, hashCode 메소드는 같은 정수를 일관해 돌려해야하며, 어떠한 정보도 제공하지 객체에 대한 equals 비교에 사용 된 값이 수정됩니다. 같은 HashMapHashSet 같은 클래스에서 사용하는 경우는 매우 가난한 hashCode를 만들 것 때문에

당신은, 상수 값을 리턴해서는 안됩니다.

또한 자바 독 언급된다

필요하지 않은 두 개의 개체 등호에 따른 다음의 각 hashCode 메소드 호출 (java.lang.Object 상위)에있어서, 동일하지 않은 경우 두 객체는 ​​별개의 정수 결과를 생성해야합니다. 그러나 프로그래머는 부동 한 객체에 대해 고유 한 정수 결과를 생성하면 해시 테이블의 성능이 향상 될 수 있음을 인식해야합니다.

+1

또한 작업을 쉽게하기 위해 매우 유용한 유틸리티 함수가 있습니다 : Objects.hash (objects ....); 해시 코드로 반환 할 수있는 int를 반환합니다. 기본적으로 당신을 위해 모든 더러운 일을합니다. – LhasaDad

+1

해시 코드를 기억하는 또 다른 포인트는 객체 인스턴스를 식별하는 불변 항목을 기반으로해야합니다. 사람들이 객체에서 상태를 설정함에 따라 변경되는 코드는 원하지 않습니다. – LhasaDad

관련 문제