아이템 11. equals를 재정의하려거든 hashCode도 재정의하라
hashCode도 재정의하지 않는다면?
- hashCode의 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킴
hashCode 일반 규약 3가지
- equals가 재정의 되지 않았다면 애플리케이션이 실행되는 동안 그 객체의 hashCode메서드는 일관되게 항상 같은 값을반환해야함
단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없음
- equals(Object)가 두 객체를 같다고 판단했다면 두 객체의 hashCode는 똑같은 값을 반환해야함
- equals(Object)가 두 객체를 다르다고 판단했더라고 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없음
hashCode 재정의를 잘못했을 때 크게 문제가 되는 조항은 두 번째
- equals는 물리적으로 다른 두 객체를 논리적으로 같다고 할 수 있지만 Object의 기본 hashCode 메서드는 이둘이 전혀 다르다고 판단하여 서로 다른 값을 반환함
hashCode 구현한다면 equals 비교에 사용되지 않은 필드는 ‘반드시’제외해야함(hashCode 두번째 규약)
해시 충돌이 적은 방법을 꼭 써야한다면 구아바(com.google.common.hash.Hashing)참고
성능 높인다고 해시코드 계산에 핵심 필드를 생략해서는 안됨