IT/Programming / / 2023. 4. 28. 09:16

<Effective Java> RULE 9 Equals를 재정의 할때는 반드시 hashCode도 재정의하라

반응형

 

Equals 메서드를 재정의하는 클래스는 반드시 hashCode메서드도 재정의 해야한다.

 

hashCode를 재정의하지 않으면 위반되는 핵심 규약은 두번째이다. 같은 객체는 같은 해시코드값을 가져야 한다는 규약이 위반되는 것이다.

@Override 
public int hashCode() { return 42; }
// 위와같이 해시코드를 구현하면 안된다.
 

모든 개체가 같은 해시코드를 갖게되면 안된다.

@Override 
public int hashCode(){
    int result = 17;
    result = 31 * result + areaCode;
    result = 31 * result + prefix;
    result = 31 * result + lineNumber;
    return result;
}
 

위의 메서드는 폰넘버 객체의 중요 필드만 입력으로 사용하여 결정적 계산을 수행

동치관계의 폰넘버객체들에는 동일 해시코드를 반환한다.

// 초기화 지연을 통한 해시코드 캐싱
private volatile int hashCode;

@Override 
public int hashCode(){
    int result = hashCode;
    if(result == 0){
        result = 17;
        result = 31 * result + areaCode;
        result = 31 * result + prefix;
        result = 31 * result + lineNumber;
        hashCode = result;
    }
    return result;
}


 

 

주의)

성능을 개선하려고 객체 중요 부분을 해시코드 계산과정에서 생략하면 안된다.

해시함수 속도는 빠를 지 몰라도 해시값 품질이 좋지 않아서 해시테이블성능을 떨어 트릴 수 있다.

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유