고급자바_hashCode(), equals()

wstudee·2020년 9월 15일
0

JAVA_고급

목록 보기
3/19

해시함수 (hash function)

  • 임의의 길이의 데이터를 고정길이의 데이터로 매핑해주는 함수
  • 해시함수에 의해 얻어지는 값 : 해시 (해시값, 해시코드, 해시체크섬 등)

객체의 동등 비교

  • HashSet, HashMap, Hashtable 과 같은 객체 사용할 경우
  • 객체가 서로 같은지 비교하기 위해 equals( ) 와 hashCode( ) 메서드 호출
  • equals( ) 와 hashCode( )는 Object에 정의되어 있음
  • 객체가 서로 같은지 여부를 결정하려면 두 메서드를 재정의해야 함
  • HashSet, HashMap, Hashtable 에서는 데이터를 추가할 때 객체가 같은지 여부 검사
  • equals( ) : 두 객체의 내용(값)이 같은지 비교하는 메서드
  • hashCode( ) : 두 객체가 같은 객체인지 비교하는 메서드 (int 반환)

equals(), hashCode() 규칙

  • 두 객체가 같으면 반드시 같은 hashcode

  • 두 객체가 같으면 equals( ) 호출했을 때 true 반환
    => 객체 a, b 가 같다면 => a.equals(b)와 b.equals(a) 모두 true 여야 함

  • 두 객체의 hashcode 가 같다고 두 객체가 반드시 같은 객체는 아님

    • 왠만하면 같지만 낮은 확률로 다른 경우도 있음
    • hashCode( ) 메서드에서 사용하는 '해싱알고리즘'에서 서로 다른 객체에 대하여 같은 hashcode 값을 만들어 낼수 있음 => 다른 객체 같은 hashcode 가능
    • 그래서 equals( ) 사용 (속도는 hashCode()가 빠름)
  • equals( ) 메서드 override 하면 반드시 hashCode( ) 메서드도 override

    • 원하는 방식의 동등비교를 할 수 있게.
  • hashCode( )는 기본적으로 Heap 에 있는 각 객체에 대한 메모리 주소 매핑 정보를 기반으로 한 정수값을 반환.
    => hashCode( )를 override 하지 않으면 절대로 두 객체가 같은 것으로 간주할 수 없음

0개의 댓글