<aside> 💡
equals
를 재정의한 클래스는 hashCode
도 재정의 해야함!!!!
그렇지 않으면 인스턴스를 HashMap
이나 HashSet
같은 컬렉션의 원소로 사용할 때 문제가 발생
</aside>
equals 가 물리적으로 다른 두 객체를 논리적으로 같다고할 때, hashCode 는 서로 다른 값을 반환함
Map<PhoneNumber, Person> map = new HashMap<>();
map.put(new PhoneNumber(010,1234,5678), new Person("리치"));
HashMap
은 해시코드가 서로 다른 엔트리끼리는 동치성 비교를 시도조차 않도록 최적화 되어있음@Override
public int hashCode() {
return 42;
}
result
를 선언한 후 값을 c로 초기화
equals
비교에 사용되는 필드Type.hashCode(f)
를 수행한다. 여기서 Type은 해당 기본타입의 박싱 클래스equals
메소드가 이 필드의 equals
를 재귀적으로 호출하여 비교한다면, 이 필드의 hashCode
를 재귀적으로 호출Arrays.hashCode
를 사용result
를 갱신한다.
result
= 31 * result
+ c;result
를 반환equals
비교에 사용되는 필드에 대해서만 해시코드를 계산