equals를 재정의한 클래스 모두에서 hashCode도 재정의 해야한다.
- HashCode일반 규약을 어기게 되어 인스턴스를 HashMap이나 HashSet 같은 컬랙션의 원소로 사용할 때 문제를 일으키기 때문
**1. equals 비교에 사용되는 정보가 변경되지 않았다면 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 어플리케이션을 다시 실행한다면 달라져도 상관없다. |
equals(Object)가 두 객체를 같다고 판단했다면, 두 객체 hashCode는 똑같은 값을 반환해야 한다.
equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.**
2번 조항에 의해 논리적으로 같은 객체는 같은 hashCode를 반환해야 하는데 논리 적으로 같다고 하더라도 hashMap상에서는 서로다른 실객체의 hash값의 차이로 null을 반환할 수 있음
Map<PhoneNumber, String> m = new HashMap<>();
m.put(new PhoneNumber(707, 867, 5039), "제니");
System.out.println(m.get(new PhoneNumber(707, 867, 5039)));
결과