HashCode란?
객체를 구별하기 위해, 고유한 정수값으로 출력시켜주는 메소드가 바로 hashCode()다.
객체 참조 변수를 출력할 때, 출력되는 Reference Address는 바로 이 hashCode를 16진수로 출력한 값이다.
ex) HashCodeTest@cb788b90(참고 사이트 : http://mwultong.blogspot.com/2008/02/16-2-10-8-hex-calc.html)
모든 클래스는 java.lang.Object의 하나의 기본이 되는 hash scheme를 상속 받는다.
클래스는 implementation을할 때(equals 같은 method overriding을 뜻한다) public int hashCode()를 반드시 override해야한다.
여기서 일반적인 규약이 있다. "Always override hashCode when you override equals" in Bloch, Joshua (2008) 의
이펙티브자바의 규약을 살펴볼 것 이다.
그리고 java.lang.String.hashCode()라는것이 있는데 아래의 내용을 간단히 참고해보자.
이제 아래의 소스를 보자.
https://gist.github.com/acetaeha/4091d379957499e97aeb
결과는 hashCode()의 유무에 따라서 달라진다 없을 경우에는 true true false가 나온다.
그 이유는 아래와 같다. hashMap에 put을할 때 아래와 같이 hashCode()가 키가 된다. hashCode는
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
ㅋㅋㅋ 이제 이펙티브 자바의 규약을 알아보도록 하자.
"equals를 재정의할 때는 반드시 hashCode도 재정의 하라!"
그렇지 않으면 위의 코드처럼 hashMap의 경우 문제가 생길수 있다.
또한 규약은 다음과 같다.
- 같은 객체의 hashCode를 여러 번 호출하는 경우, equals가 사용하는 정보들이 변경되지 않았다면, 언제나 동일한 정수가 반환되어야 한다.
- equals(Object)메소드가 true이면 두 객체의 hashCode 값은 같아야 한다.
- equals(Object)메소드가 false이면 두 객체의 hashCode가 꼭 다를 필요는 없다. 하지만 서로 다른 hashCode 값이 나오면 해시 테이블(hash table)의 성능이 향상될 수 있다는 점은 이해하고 있어야 한다.
hashCode를 재정의 하지 않으면 위반되는 핵심규약은 같은 객체는 같은 해시코드 값을 가져야 한다는 규약이 위반되는 것이다.
References
- 이펙티브 자바 규칙 9
'Language > Java' 카테고리의 다른 글
String을 날짜 포맷으로 변환하기! (0) | 2015.06.15 |
---|---|
clone을 재정의할 때는 신중하라! (0) | 2015.06.11 |
unicode 문제 해결(\u003d 등) (1) | 2015.01.12 |
[문제] Java main함수에서 static 키워드가 없다면?? (2) | 2014.07.04 |
Mac에서 Jdk8 설치 되는 장소! (0) | 2014.07.02 |