본문 바로가기
Java/Java

[Java] 컬렉션 프레임워크 - Set<E> 인터페이스

by 기록하는_사람 2022. 10. 18.

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();
	}

}

댓글