HashSet - 직접 구현하는 Set3 - 직접 만든 객체 보관
2024. 6. 12. 07:49ㆍ김영한 Java/컬렉션 프레임워크
직접 만든 객체를 Set에 보관
MyHashSetV2는 Object를 받을 수 있다 .따라서 직접 만든 Member와 같은 객체도 보관할 수 있다.
여기서 주의할 점은 직접 만든 객체가 hashCode(), equals() 두 메서드를 반드시 구현해야 한다는 점이다.
package collection.set;
import collection.set.member.Member;
public class MyHashSetV2Main2 {
public static void main(String[] args) {
MyHashSetV2 set = new MyHashSetV2(10);
Member hi = new Member("hi");
Member JPA = new Member("JPA");
Member java = new Member("java");
Member spring = new Member("spring");
System.out.println("hi.hashCode() = " + hi.hashCode());
System.out.println("JPA.hashCode() = " + JPA.hashCode());
System.out.println("java.hashCode() = " + java.hashCode());
System.out.println("spring.hashCode() = " + spring.hashCode());
set.add(hi);
set.add(JPA);
set.add(java);
set.add(spring);
System.out.println(set);
//검색
Member searchValue = new Member("JPA");
boolean result = set.contains(searchValue);
System.out.println("set.contains(" + searchValue.getId() + ") = " + result );
}
}
실행 결과
hi.hashCode() = 3360
JPA.hashCode() = 73690
java.hashCode() = 3254849
spring.hashCode() = -895679956
MyHashSetV2{buckets=[[Member{id='hi'}, Member{id='JPA'}], [], [], [], [], [], [Member{id='spring'}], [], [], [Member{id='java'}]], size=4, capacity=10}
set.contains(JPA) = true

- Member의 hashCode()를 id값을 기반으로 재정의해 두었다.
- hashIndex(Object value)에서 value.hashCode() 를 호출하면 실제로는 Member에서 재정의한 hashCode()가 호출된다.
- 이렇게 반환된 해시 코드를 기반으로 해시 인덱스를 생성한다.
equals() 사용처
그렇다면 equals()는 언제 사용할까?
"JPA"를 조회할 때 해시 인덱스는 0이다. 따라서 배열의 0번 인덱스를 조회한다.
여기에는 [hi, JPA]라는 회원 두 명이 있다. 이것을 하나하나 비교해야 한다. 이때 equals()를 사용해서 비교한다.
따라서 해시 자료 구조를 사용할 때는 hashCode()는 물론이고, equals()도 반드시 재정의해야 한다. 참고로 자바가 제공하는 기본 클래스들은 대부분 hashCode(), equals()를 함께 재정의해 두었다.
'김영한 Java > 컬렉션 프레임워크' 카테고리의 다른 글
| equals, hashCode의 중요성2 (0) | 2024.06.13 |
|---|---|
| equals, hashCode의 중요성 1 (0) | 2024.06.13 |
| HashSet - 직접 구현하는 Set2 - MyHashSetV2 (0) | 2024.06.12 |
| HashSet - 자바의 hashCode() (0) | 2024.06.11 |
| Hash - 해시 알고리즘6 - 해시 충돌 구현 (0) | 2024.06.09 |