← 질문 목록
#69깊이 0
동등한 객체의 해시값도 같아야 하는 이유는?
해시 컬렉션은 hashCode로 버킷을 고른 뒤 equals를 확인한다. 동등한 객체의 해시값이 다르면 다른 버킷을 찾아 같은 키를 놓친다.
조회 키→hashCode
검색할 버킷을 고른다
버킷→equals
후보와 논리적 동등성을 비교한다
equals→결과
같은 키인지 결정한다
equals는 반사성, 대칭성, 추이성, 일관성을 지켜야 하며 null에는 거짓이어야 한다. hashCode는 동등하면 같아야 하지만 충돌은 허용된다.
equals가 같다고 본 두 객체에서 다른 hashCode가 나오면 규약이 깨진다. hashCode가 더 적은 필드를 써도 그 조건만 지키면 된다. 특히 키를 Map에 넣은 뒤 해시에 쓰인 필드를 바꾸면 다시 찾지 못할 수 있다.
상속 계층에서 값 동등성을 추가하면 대칭성이 쉽게 깨진다. 값 객체는 불변으로 만들고 두 메서드를 같은 필드에서 함께 생성하는 편이 안전하다.