본문 바로가기

언어/자바

[Effective java] equals를 재정의하려거든 hashCode도 재정의하라

equals를 재정의 하면 반드시 hashCode도 재정의하라

여러 컬렉션이 hashCode를 사용하기 때문에 논리적으로 동일한 객체를 사용할 때  hashCode를 재정의 하지 않으면 예상치 못한 결과가 나올 수 있다.

 

- 두 객체가 논리적으로 동일(equals가 true)이면 hashCode는 반드시 같아야한다.

- 두 객체가 논리적으로 다르면 hashCode는 가급적 달라야한다.

- Equals 비교에서 사용하지 않는 필드는 hashCode 생성시 반드시 제외해야한다.

- 요즘은 IDE가 좋으니 가급적 IDE에서 제공하는 자동 생성 기능을 사용하자.

 

hashCode생성 시에 전통적으로 31을 곱해가면서 연산한다.

이유는 잘 모르겠다. 홀수이고 소수이기 때문이라고 하는데..

짝수를 하면 오버플로우가 나서 정보를 잃기 때문이라고 한다.