반응형
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를 사용해야 한다.
반응형
'프로그래밍 > 자바' 카테고리의 다른 글
[JAVA] 13장. 쓰레드 (0) | 2022.07.31 |
---|---|
[JAVA] 12장. 제네릭스, 열거형, 어노테이션 (0) | 2022.07.31 |
11장 컬렉션 프레임 워크 (0) | 2022.07.28 |
10장 날짜와 시간 & 형식화 (0) | 2022.07.28 |
8장 예외처리, 9장 유틸클래스 (0) | 2022.07.28 |