package ch15.sec03.exam02;
import java.util.Objects;
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
// name, age 같으면 true return
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Member member = (Member) o;
return age == member.age && Objects.equals(name, member.name);
}
// name, age 같으면 동일한 hashCode return
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package ch15.sec03.exam02;
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
// HashSet 컬렉션 생성
Set<Member> set = new HashSet<>();
// Member 에 객체 저장
/* 인스턴스는 다르지만 동등 객체이므로 객체 1개만 저장 (equals, hashSet method 재정의함)*/
set.add(new Member("성이름", 30));
set.add(new Member("성이름", 30));
// 저장된 객체 수 출력
System.out.println("set.size() = " + set.size()); // 1
}
}
2. TreeSet<E>
데이터가 정렬된 상태로 저장된는 이진 검색 트리(binary search tree)의 형태로 요소를 저장한다.
루트 노드(root node): 루트 노드라고 불리는 하나의 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할 수 있는 구조
레드-블랙 트리 : 부모 노드보다 작은 값을 가지는 노드는 왼쪽 자식으로, 큰 값을 가지는 노드는 오른쪽 자식으로 배치하여 데이터의 추가나 삭제 시 트리가 한쪽으로 치우쳐지지 않도록 균형을 맞추어준다.
HashSet 보다 데이터의 추가와 삭제는 시간이 더 걸리지만(비교 횟수 증가) 검색과 정렬에 유리하다.
Set Interface를 구현하므로, 요소를 순서에 상관 없이 저장하고 중복된 값(동등 객체)은 저장하지 않는다.
순서에 상관 없이 저장하지만 TressSet Instance에 저장되면 자동으로 정렬된다.
이진 검색 트리 형태로 데이터를 저장하기에 기본적으로 nature ordering을 지원하며, 생성자의 매개변수로 Comparator 객체를 입력하여 정렬 방법을 임의로 지정 가능하다.
// TreeSet생성
TreeSet<Integer> set1 = new TreeSet<Integer>();
// new에서 type parameter 생략 가능
TreeSet<Integer> set2 = new TreeSet<>();
// set1의 모든 값을 가진 TreeSet 생성
TreeSet<Integer> set3 = new TreeSet<Integer>(set1);
// 초기값 지정
TreeSet<Integer> set4 = new TreeSet<Integer>(Arrays.asList(1,2,3));