티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기

equals 메서드를 재정의하는 클래스는 반드시 hashCode 메서드도 재정의 해야 한다.
재정의하지 않으면  HashMap, HashSet, Hashtable 같은 Hash기반 컬렉션과 함께 사용할때 오작동하게 된다.

public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; @Override public boolean equals(Object o) { if (0 == this) return true; if (!(o instanceof PhoneNumber)) return false; PhoneNumber ph = (PhoneNumber) o; return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } }

이 클래스를 HashMap 과 함께 사용한다고 생각하자.

Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>(); m.put(new PhoneNumber(707, 867, 5309), "Jenny"); //이 상황에서 m.get(new phoneNumber(707, 867, 5309)); //를 호출하면 "Jenny"가 반환될 거라 기대하겠지만 Null 이 리턴된다.

put 할때 PhoneNumber 객체와 get 할때 PhoneNumber 객체는 hashCode를 재정의하지 않았으므로 서로 다른 두 객체이기 때문이다.
HashMap은 성능 최적화를 위해 내부에 보관된 항목의 해시 코드를 캐시해 두고, 캐시된 해시 코드가 없는 객체는 동일성 검사조차 하지 않기 때문이다.

책에서는 HashCode 를 재정의하는 지침들에 대해서 설명하고 있다.
필요할때 읽어보도록 하자.

그렇게 해서 만들어진 HashCode 재정의 코드.

private volatile int hashCode; @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * result + lineNumber; hashCode = result; } return result; }


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함