equals 를 정의할땐 hashcode도 정의하자
Hashmap, hashSet등의 원소로 사용될 경우 문제가 발생한다.
HashMap<PhonNumber,String> m = new Hashmap<>();
m.put(new PhoneNumber(707, 867, 5309),"jenny");
m.get(new PhoneNumber(707, 867, 5309));
what happened?
- return null
- 넣을때 한번, 꺼낼때 한번 객체를 생성했다. 하지만 이들은 논리적 동치이다. 둘의 해쉬가 다르기 때문이다.
- PhoneNumber 클래스에 dashcode 를 적절하게? 구현해준다.
@override
public int hashcode(){ return 42;}
- 이렇게 하면 O(1) 이 아니라 O(n) 이 된다. 모든 해쉬가 같기 때문에~ . 결국 다른 객체에 다른 해쉬를 반환하도록 하는것이 성능을 고려하는 측면이다.
- 해쉬함수 만드는 방식
*
- 위 PhoneNumber 클래스 해시함수 예시
@Override
public int hashCode() {
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
@Overrride
public int hashCode(){
return Object.hash(lineNum,prefix,areaCode);
}
// 나라면 그냥 이렇게 쓸듯 하지만 성능이 아쉽다고 한다.
- 성능을 고려하는 목저으로 핵심필드를 빼고 hashcode를 정의하지 말자.(해시테이블 성능을 놓치게된다)
equals 를 정의할땐 hashcode도 정의하자
Hashmap, hashSet등의 원소로 사용될 경우 문제가 발생한다.
what happened?
*