Skip to content

모든 객체의 공통 메서드-11 #2

@iamsunk

Description

@iamsunk

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를 정의하지 말자.(해시테이블 성능을 놓치게된다)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions