ConcurrentSkipListSet — 확장 가능한 동시성 정렬 셋
ConcurrentSkipListSet — 확장 가능한 동시성 정렬 셋
ConcurrentSkipListSet<E>는 ConcurrentSkipListMap을 기반으로 한 확장 가능한(scalable) 동시성 NavigableSet 이에요. 요소는 자연 순서(natural ordering) 또는 생성 시 제공한 Comparator에 따라 정렬되어 유지돼요.
본문
개념 이해하기
ConcurrentSkipListSet은 ConcurrentSkipListMap을 기반으로 한 확장 가능한 동시성 NavigableSet 구현이에요. 요소는 생성자에 따라 자연 순서 또는 Comparator에 따라 정렬돼요.
public class ConcurrentSkipListSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable
contains,add,remove및 그 변형에 대해 평균 log(n) 시간 비용을 제공해요. 삽입·제거·접근 연산이 여러 스레드에서 안전하게 동시에 실행돼요.- iterator와 spliterator는 약하게 일관적이에요.
- 오름차순 정렬 뷰와 그 iterator가 내림차순보다 더 빠르다는 점을 기억하세요.
size메서드는 상수 시간이 아니에요. 순회가 필요하고, 순회 중 수정되면 부정확할 수 있어요.addAll,removeIf,forEach같은 일괄 연산은 원자적이지 않아요.null과null반환 값을 "요소 없음"과 구별할 수 없으므로null요소를 허용하지 않아요.
생성자
public ConcurrentSkipListSet() — 자연 순서로 요소를 정렬하는 새 빈 셋을 만들어요.
public ConcurrentSkipListSet(Comparator<? super E> comparator) — 지정된 comparator로 정렬하는 새 빈 셋을 만들어요. null이면 자연 순서.
public ConcurrentSkipListSet(Collection<? extends E> c) — 주어진 컬렉션의 요소를 담고 자연 순서로 정렬하는 새 셋을 만들어요.
ClassCastException(비교 불가),NullPointerException
public ConcurrentSkipListSet(SortedSet<E> s) — 주어진 정렬 셋과 같은 요소·정렬을 가진 새 셋을 만들어요.
NullPointerException
기본 연산
public ConcurrentSkipListSet<E> clone() — 이 셋의 얕은 복사본을 반환해요 (요소 자체는 복제되지 않음).
public int size() — 요소 수를 반환해요. 상수 시간이 아니며 순회가 필요해요.
public boolean isEmpty() — 요소가 없으면 true.
public boolean contains(Object o) — o.equals(e)인 요소가 있으면 true.
ClassCastException,NullPointerException
public boolean add(E e) — e.equals(e2)인 요소 e2가 없을 때만 e를 추가해요. 이미 있으면 셋을 바꾸지 않고 false.
ClassCastException,NullPointerException
public boolean remove(Object o) — 요소가 있으면 제거해요. 제거됐으면 true.
ClassCastException,NullPointerException
public void clear() — 모든 요소를 제거해요.
public boolean equals(Object o) — 같은 크기고 모든 멤버가 서로 포함되는 셋이면 true.
public boolean removeAll(Collection<?> c) — 지정 컬렉션에 포함된 요소를 모두 제거해요(비대칭 차집합 효과).
ClassCastException(선택),NullPointerException
내비게이션 연산 (NavigableSet)
public E lower(E e) — e보다 엄격히 작은 가장 큰 요소, 없으면 null.
ClassCastException,NullPointerException
public E floor(E e) — e보다 작거나 같은 가장 큰 요소, 없으면 null.
public E ceiling(E e) — e보다 크거나 같은 가장 작은 요소, 없으면 null.
public E higher(E e) — e보다 엄격히 큰 가장 작은 요소, 없으면 null.
public E pollFirst() — 첫(가장 낮은) 요소를 꺼내 제거하거나, 비어 있으면 null.
public E pollLast() — 마지막(가장 높은) 요소를 꺼내 제거하거나, 비어 있으면 null.
public Comparator<? super E> comparator() — 정렬에 쓰는 comparator 또는 자연 순서를 쓰면 null.
public E first() — 첫(가장 낮은) 요소를 반환해요. 비어 있으면 NoSuchElementException.
public E last() — 마지막(가장 높은) 요소를 반환해요. 비어 있으면 NoSuchElementException.
public Iterator<E> iterator() — 오름차순으로 요소를 반환하는 iterator.
public Iterator<E> descendingIterator() — 내림차순으로 요소를 반환하는 iterator.
public NavigableSet<E> descendingSet() — 역순 뷰. s.descendingSet().descendingSet()은 s와 본질적으로 동등.
public void addFirst(E e) / public void addLast(E e) — 이 셋이 정렬 기반이라 명시적 위치 지정을 지원하지 않으므로 항상 UnsupportedOperationException을 던져요. (JDK 21+)
범위 뷰
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) — fromElement(포함 여부)부터 toElement(포함 여부)까지의 뷰를 반환해요. 범위 밖 삽입 시 IllegalArgumentException. 다른 내비게이션 변형(subSet(from,to), headSet(to,incl), headSet(to), tailSet(from,incl), tailSet(from))과 각 예외(ClassCastException, NullPointerException, IllegalArgumentException)도 있어요.
spliterator
public Spliterator<E> spliterator() — 오름차순 encounter 순서로 CONCURRENT, NONNULL, DISTINCT, SORTED, ORDERED를 보고하는 spliterator를 반환해요. (JDK 1.8+)