책 전체의 내용은 아래 링크
규칙9. equals를 재정의할 때는 반드시 hashCode도 재정의하라
- 같은 객체는 같은 해시코드 값을 가져야 한다.
- equals(Object) 메서드가 같다고 판정한 두 객체의 hashCode 값은 같아야 한다.
- equals(Object) 메서드가 다르다고 판정한 두 객체의 hashCode 값은 꼭 다를 필요는 없다.
- 그러나 서로 다른 hashCode 값이 나오면 해시테이블 성능이 향상될 수 있다.
- 같은 값의 다른 객체의 경우, 다른 해시값을 가지면 성능이 향상 되는 경우.
- 해시 함수는 다른 객체에는 다른 해시 코드를 반환하도록 해야 한다.
- hashCode 구현이 끝나면, 동치 관계의 객체 해시코드 값이 똑같이 계산되는지 확인한다.
- 객체의 동치 관계: (객체 == 객체)
- equals 계산에 쓰이지 않는 필드는 반드시 제외해서 해시 함수를 만든다.
- 해시코드 계산 비용이 높은 변경 불가능 클래스는 객체 안에 캐시해 둘 수 있다.
- 최초 호출까지 해시코드 초기화를 늦출 수도 있다. (lazy initialization)
// lazy initialization private volatile int hashCode; @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result = 31 * result + field1; result = 31 * result + field2; hashCode = result; } return result; }
- 주의할 점: 객체의 중요 부분을 해시 코드 계산 과정에 생략하면 안된다.
'Programming' 카테고리의 다른 글
Sync VS Async 차이 비교 / Logback / Log Appender (0) | 2022.01.13 |
---|---|
Spring Autowired VS Constructor 차이 비교 / Spring DI (Dependency Injection, 의존주입) 시 어떤 것이 좋을까? (0) | 2022.01.13 |
Effective Java 2/E, 이펙티브 자바 책 핵심요약 (0) | 2021.12.28 |
Linux 명령어: find (0) | 2021.12.22 |
프로세스의 메모리 주소 공간 (Memory address space of Process) (0) | 2021.12.19 |