Skip to content

item 11 leekyunghee

leekyunghee edited this page Mar 25, 2020 · 3 revisions

equals를 재정의하려거든 hashCode 도 재정의하라.

  • 하나의 객체가 생성이 되고 인스턴스의 equals의 사용되는 정보가 멤버변수 바뀌지 않아도 hashcode는 몇번을 변경해도 동일하다.

Object 명세 규약

  • equals 비교에 사용되는 정보가 변경되지 않았다면 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇번을 호출해도 일관되게 항상 같은 값을 반환 해야된다.
  • equals(Object)가 두 객체를 같다고 판단한다면 두객체의 hashCode는 똑같은 값을 반환해야 한다.
  • 두 객체가 다르다고 하더라도 hashCode가 서로 다른 값을 반환할 필요는 없다.

단 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.

다음 예제 코드 PhoneNumber 클래스의 인스턴스를 HashMap의 원소로 사용한다고 해보자.

Map(PhoneNumber, String> m = new HashMap<>();
m.put(new PhoneNumber(707, 867, 5309), "제니");
m.get(new PhoneNumber(707, 867, 5309))를 실행하면 

이 클래스의 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출하면 된다.

핵심 정리

서로 다른 인스턴스라면 되도록 해시코드도 서로 다르게 구현해야 한다. 
AutoValue 프레임워크를 사용하자. 
Clone this wiki locally