반응형

 

 

HashSet에서는 equals()와 hashCode()를 둘 다 사용한다?

 

HashSet은 hashCode()만 사용해서 구현을 하는 줄 잘못 알고 있었다.

 

 


 

기본적으로 bucket에 데이터를 입력할 때 hashCode()를 이용하는 것은 맞다.

 

hashCode 값이 같은 데이터의 발생 즉, 충돌이 일어난다면 그때 equals()를 사용한다.

 

예를들어 "5"라는 데이터를 입력했을 때 "9"라는 데이터가 같은 hashCode를 반환할 수 있기 때문이다.

 

그때 equals()를 사용해서 정말 같은 데이터인지 확인할 때 사용한다.

 


 

(1) hashCode()가 같다. equals()가 같다. => 중복 데이터이므로 저장이 불필요 

 

(2) hashCode()가 같다. equals()가 다르다. => 우연하게 hashcode가 같은 경우이므로 데이터 저장

* chaining 기법으로 충돌을 해결

* LinkedList로 연결해놓는다. value가 8개를 넘어가면 RBtree로 변환.

* 검색시에는 hashcode()로 bucket index를 찾고, equals()로 비교하여 value를 확인한다.

 


 

hashCode()는 bucket index를 찾을 때, equals()는 내부에서 bucket value를 비교할 때 사용한다.

그래서 hashCode(), equals()를 둘다 overrirde해줘야 하고, 같은 field를 사용해야 한다.

 

반응형

+ Recent posts