Set
은 중복을 허용하지 않고, 순서를 보장하지 않는 자료구조이다.Set
은 수학적 집합 개념을 구현한 것으로, 특정 요소가 집합에 있는지 여부를 확인하는데 최적화되어 있다.자바의
Set
인터페이스는HashSet
,LinkedHashSet
,TreeSet
등의 여러 구현 클래스를 가지고 있으며, 각 클래스는Set
인터페이스를 구현하며 각각의 특성을 가지고 있다.
메서드 | 설명 |
---|---|
add(E e) | 지정된 요소를 Set 에 추가한다(이미 존재하는 경우 추가하지 않음) |
addAll(Collection<? extends E> c) | 지정된 컬렉션의 모든 요소를 Set 에 추가한다. |
contains(Object o) | Set 이 지정된 요소를 포함하고 있는지의 여부를 반환한다. |
containsAll(Collection<?> c) | Set 이 지정된 컬렉션의 모든 요소를 포함하고 있는지의 여부를 반환한다. |
remove(Object o) | 지정된 요소를 Set 에서 제거한다. |
removeAll(Collection<?> c) | 지정된 컬렉션에 포함된 요소를 Set 에서 모두 제거한다. |
retainAll(Collection<?> c) | 지정된 컬렉션에 포함된 요소만을 유지하고 나머지 요소는 Set 에서 제거한다. |
clear() | Set 에서 모든 요소를 제거한다. |
size() | Set 에 있는 요소의 수를 반환한다. |
isEmpty() | Set 이 비어있는지의 여부를 반환한다. |
iterator() | Set 의 요소에 대한 반복자를 반환한다. |
toArray() | Set 의 모든 요소를 배열로 반환한다. |
toArray(T[] a) | Set 의 모든 요소를 지정된 배열로 반환한다. |
HashSet
의 주요 연산(추가, 삭제, 검색)은 평균적으로 O(1)
의 시간 복잡도를 가진다.O(n)
으로 좋지 않다.HashSet
은 데이터의 양이 배열 크그의 75%를 넘어가면 배열의 크기를 2배로 늘리고 2배 늘어난 크기를 기준으로 모든 요소에 해시 인덱스를 다시 적용한다.재해싱(rehashing)
이라 한다.HashSet
의 기본 크기는 16
이다.LinkedHashSet
은 HashSet
에 연결 리스트를 추가해서 요소들의 순서를 유지한다.LinkedHashSet
도 HashSet
과 마찬가지로 주요 연산에 대해 평균 O(1)
시간 복잡도를 가진다.HashSet
보다는 조금 더 무겁다.TreeSet
은 이진 탐색 트리를 개선한 레드-블랙 트리를 내부에서 사용한다.비교자(Comparator)
로 변경할 수 있다.O(log n)
의 시간 복잡도를 가진다.import java.util.*;
public static void main(String[] args) {
run(new HashSet<>());
run(new LinkedHashSet<>());
run(new TreeSet<>());
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
HashSet
, LinkedHashSet
, TreeSet
모두 Set
인터페이스를 구현하기 때문에 구현체를 변경하면서 실행이 가능하다.
iterator()
를 호출하면 컬렉션을 반복해서 출력할 수 있다.
iterator.hasNext()
: 다음 데이터가 있는지 확인한다.iterator.next()
: 다음 데이터를 반환한다.set = class java.util.HashSet
A 1 B 2 C
set = class java.util.LinkedHashSet
C B A 1 2
set = class java.util.TreeSet
1 2 A B C