Item 09. equals를재정의할때는반드시 hashCode도재정의하라

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

hashCode를 재정의하지 않으면 2번 규약 위반된다

ㄴ object 클래스명세일반규약
 1. 응용프로그램 실행 중에 같은 객체의 hashCode를 여러번 호출하는 경우, 
    equlas가 사용하는 정보들이 변경되지 않았다면 언제나 동일한 정수가 반환되어야한다
 2. equals(Object) 메서드가 같으면 두객체의 hashCode 값은 같아야한다
 3. equals(Object) 메서드가 같지 않다면 hashCode값은 꼭 다를 필요는 없으나 서로 다른 hashCode값은 해시 테이블 성능을 향상시킬수 있다

+ hashCode 메서드 재정의 방법

  1. 0 아닌 상수를 result라는 int 변수에 저장

  2. 객체 안에 있는 모든 중요 필드에 대해 아래의 절차 시행

    A. 해당 필드에 대한 int 해시 코드 c를 계산

type 계산 방법
boolean (f ? 1: 0)
byte, char, short, int (int) f
long (int) (f^(f>>>32))
float Float.floatToUntBits(f)
double Double.doubleToLongBits(f) => long으로 해시코드 변환
객체 equlas 메서드가 해당 필드의 equals메서드를 재귀적 호출하는 경우해당 필드의 hashCode 메서드를 재귀적 호출하여 해시 코드 계산 필드값이 null인 경우 0을 반환
배열 배열의 각 원소가 별도 필드인 것 처럼 계산
 B. A에 계산된 해시 코드 c를 result에 같이 결합한다
  1. result를 반환한다

  2. hashCode구현이 끝났다면, 동치 관계에 있는 객체의 해시 코드 값이 똑같이 계산되는지 점검하라.

  3. 단위 테스트를 작성해서 생각대로 되는지 확인하라

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

results matching ""

    No results matching ""