ConcurrentSkipListSet — 확장 가능한 동시성 정렬 셋

ConcurrentSkipListSet — 확장 가능한 동시성 정렬 셋

ConcurrentSkipListSet<E>ConcurrentSkipListMap을 기반으로 한 확장 가능한(scalable) 동시성 NavigableSet 이에요. 요소는 자연 순서(natural ordering) 또는 생성 시 제공한 Comparator에 따라 정렬되어 유지돼요.

출처: Java API Reference

본문

개념 이해하기

ConcurrentSkipListSetConcurrentSkipListMap을 기반으로 한 확장 가능한 동시성 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 같은 일괄 연산은 원자적이지 않아요.
  • nullnull 반환 값을 "요소 없음"과 구별할 수 없으므로 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+)

더 알아보기 (Learn more)