equals 를 재정의했다는 것은 객체의 논리적 같음이 바뀌었다는 말이다.
그러나, hashCode를 재정의 하지 않는다면 같아진 객체들도 Object 에서의 정의에 따라 다른 해시 값을 같게 되고, HashMap, HashSet 과 같은 여러 자료구조에서 의도치 않게 동작할 수 있다.
hashCode 구현
해당 객체의 핵심 필드들의 해시 코드를 생성 - 해당 Type.hashCode 를 활용한다.
이후 합쳐줄 때, result = 31*result + filed hashCode 로 합쳐준다 - 31은 소수이며 홀수, (i << 5) - 1 로 최적화, 오버플로우 시 정보 손실을 막는 등의 이유로 사용함
Objects.hash 를 사용해도 위와 비슷한 동작을 한다. 그러나, 입력값을 배열로 만들고, 박싱 및 언박싱의 과정 때문에 성능이 조금 아쉽다.
핵심 필드들을 사용해서 hashCode를 생성하는 이유는 논리적으로 동치가 아닌 객체들의 해시코드를 모두 다르게 하여 해시테이블의 성능을 O(1) 으로 사용할 수 있도록 하기 위함이다.
요즘 IDE, 프레임워크 들은 이를 위해 한번에 equals, hashCode 를 정의해준다. ex) SpringBoot의 @EqualsAndHashCode