이펙티브 자바 아이템 11 : equals를 재정의 하려거든 hashcode를 재정의 하라

👉 equals를 재정의한 클래스 모두에서 hashcode도 재정의해야 한다. 그렇지 않으면 hashcode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킨다.

👉 규약

👉 hashcode를 재정의 하지 않은 코드의 문제점

핸드폰 번호를 Key로 사용하는 HashMap을 만든다.

public class Phone {

    private String number;

    public Phone(String number) {
        this.number = number;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }

        if (!(o instanceof Phone)) {
            return false;
        }

        Phone phone = (Phone) o;
        return Objects.equals(number, phone.number);
    }

}

class Main {

    public static void main(String[] args) {
        Map<Phone, String> map = new HashMap<>();

        Phone phone = new Phone("010-1234-5678");
        map.put(phone, "yhh");

        System.out.println(map.get(phone));             // yhh
        System.out.println(map.get(new Phone("010-1234-5678")));    // null

    }

}

equals를 재정의 하여 논리적으로 같은 객체로 만들었지만 해시코드가 다르기때문에 서로 다른 값을 반환한다.

👉 해결방법

👉 정리