만약 당신이 equals를 재정의 했다면 hashCode도 재정의해라. 그렇지 않으면 hashCode 일반 규약을 어기게 될 것이다. 이는 HashMap, HashSet 같은 컬렉션을 사용할 때 문제가 생긴다.
다음은 hashCode의 일반 규약이다.
일반 규약 세 가지 중에서 재정의를 잘못했을 경우, 가장 문제가 되는건 두 번째 조항이다.
- 논리적으로 같은 객체는 같은 해시코드를 반환해야 한다.
만약 논리적으로 같은 객체인데 다른 해시코드를 반환한다면 HashMap에 들어간 객체를 같은 키로 요청했을 경우, null이 나오게 된다. 내가 원하는 값을 받을 수가 없게 된다.
그러면 적절한 hashCode 작성법은 무엇일까?
다음은 hashCode 작성 요령이다.
여기까지 hashCode를 구현했다면 동치인 인스턴스가 똑같은 해시코드(일반 규약 2번째)를 반환하는지 테스트하자.
전형적인 hashCode메서드
@Override public int hashCode(){
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
단순히 Object 클래스의 hashCode 메서드를 사용해서 hashCode를 생성할 순 있지만 내부적으로 배열을 만들고 기본 타입이 있다면 박싱, 언박싱 등 여러가지를 하기 때문에 성능이 떨어진다.
가능하다면 AutoValue 프레임워크를 사용하여 만드는게 좋다.