- 어플리케이션이 다시 실행된다면 값이 달라져도 된다.
- 다만 다른 객체에 대해서 다른 값을 반환해야 해시테이블의 성능이 좋아진다.
- 핵심 필드는 equals 비교에 사용되는 필드
a . 해당 필드의 해시 코드를 계산한다
Type.hashCode(f)
, EX) Integer.hashCode(f)
- 복잡해질 것 같으면 필드의 표준형(canonical representation)을 만들어 그 표준형의 hashCode를 호출
- 필드의 값이 null이면 0사용 (전통적으로)
- 배열에 핵심 원소가 하나도 없다면 상수(0 추천) 사용한다.
- 모든 원소가 핵심 원소라면
Arrays.hashCode
를 사용한다.
b . 2.a 단계에서 계산한 해시코드 c로 result를 갱신한다.
- equals, hashCode를 AutoValue로 생성했다면 패스
// 전형적인 hashCode 메서드
@Override public int hashCode() {
int result = Short.hashCode(areaCode); // 31 * result 필드를 곱하는 순서에 따라 result 값이 달라진다.
result = 31 * result + Short.hashCode(prefix); //31은 전통적으로 소수를 사용
result = 31 * result + Short.hashCode(lineNum);
return result;
}
@Override public int hashCode(){
return Objects.hash(lineNum, prefix, areaCode);
}
- 입력 인수를 위한 배열이 만들어지고
- 기본 타입이 있으면 박싱, 언박싱을 거쳐야 한다.
private int hashCode; // 자동으로 0으로 초기화된다.
@Override public int hashCode() {
int result = hashCode;
if (result == 0) {
result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
hashCode = result;
}
return result;
}
- 스레드 안정성 고려 필요
Reference: