Set<E> 인터페이스
📌 Set<E> 인터페이스를 구현하는 컬렉션 클래스의 특징
① 인스턴스의 저장 순서를 유지하지 않음.
② 동일한 인스턴스의 중복 저장을 허용하지 않음.
HashSet<E> 클래스
📌 HashSet<E> 클래스
📄 HashSetTest.java
package set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
set.add("apple"); // 중복.
System.out.println(set.size()); // 3
for(Iterator<String> it = set.iterator(); it.hasNext();) {
System.out.print(it.next() + ' '); // banana apple cherry
}
System.out.println();
for(String s : set) {
System.out.print(s + ' '); // banana apple cherry
}
System.out.println();
}
}
📌 동일한 인스턴스라고 판단하는 기준
① public boolean equals(Object obj)
: equals()의 원형은 ==과 같음.(== : 주솟값이 같은 지 비교.)
문자열의 경우, equals()가 재정의되어 문자열 내용이 같은 지 비교 후 값 반환함.
② public int hashcode( )
: 인스턴스가 다르면 다른 값을 반환함.
💡 재정의 된 equals()의 값이 true이면, 동일한 hashCode() 반환 값을 가져야 함.
논리적으로 동일함을 위해, hashCode() 메서드를 재정의해 동일한 값이 반환되도록 함.
따라서, hashCode()를 오버라이딩하여 equals()가 true일 경우 같은 hashCode를 반환하도록 해야 함.
💡 System.identityHashCode()
: 고유한 hashCode를 반환하는 메소드.
📄 HashSetEqualTest.java
package set;
import java.util.HashSet;
class Num {
private int n;
public Num(int n) { this.n = n; }
@Override
public String toString() {
return String.valueOf(n);
}
@Override
public int hashCode() {
return n % 3; // n의 값이 같으면, 같은 hashCode 같도록.
}
@Override
public boolean equals(Object obj) { // n의 값이 같으면, true 반환.
if(n == ((Num)obj).n) {
return true;
}
else {
return false;
}
}
}
public class HashSetEqualTest {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
set.add(new Num(1204));
set.add(new Num(1013));
set.add(new Num(1004));
set.add(new Num(1013));
System.out.println(set.size()); // 3
for(Num n : set) {
System.out.print(n.toString() + ' '); // 1204 1013 1004
}
System.out.println();
}
}
TreeSet<E> 클래스
📌 TreeSet<E> 클래스
: 자료구조 중 하나인 트리를 기반으로 인스턴스를 저장하는 클래스.
정렬된 상태가 유지되면서 인스턴스가 저장됨.
📌 인스턴스의 참조 순서는 오름차순을 기준으로 함.
📌 public interface Comparator<T>
: int compare(T o1, T o2)의 구현을 통해 정렬 기준 결정.
📌 int compare(T o1, T o2)
① o1이 o2보다 크면, 양의 정수 반환.
② o1이 o2보다 작으면, 음의 정수 반환.
③ o1과 o2가 같으면, 0 반환.
📄 TreeSetTest.java
package set;
import java.util.Comparator;
import java.util.TreeSet;
class StringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length(); // 문자열 길이로 비교.
}
}
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> tree = new TreeSet<>(new StringComparator());
// apple, banana 추가.
tree.add("apple");
tree.add("banana");
for(String s : tree) {
System.out.print(s.toString() + ' '); // apple banana
}
System.out.println();
// cherry 추가.
tree.add("watermelon");
for(String s : tree) {
System.out.print(s.toString() + ' '); // apple banana watermelon
}
System.out.println();
// pear 추가.
tree.add("pear");
for(String s : tree) {
System.out.print(s.toString() + ' '); // pear apple banana watermelon
}
System.out.println();
// blueberry 추가.
tree.add("blueberry");
for(String s : tree) {
System.out.print(s.toString() + ' '); // pear apple banana blueberry watermelon
}
System.out.println();
}
}
'Java > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 - Map<K, V> 인터페이스 (0) | 2022.10.18 |
---|---|
[Java] 컬렉션 프레임워크 - Queue<E> 인터페이스 (0) | 2022.10.18 |
[Java] 컬렉션 프레임워크 - List<E> 인터페이스 (0) | 2022.10.18 |
[Java] 와일드카드(Wildcard) (0) | 2022.10.18 |
[Java] 제네릭(Generics) (0) | 2022.10.18 |
댓글