LinkedBlockingDeque<E> — 링크드 노드 기반 선택적 제한 블로킹 데크
LinkedBlockingDeque<E> — 링크드 노드 기반 선택적 제한 블로킹 데크
LinkedBlockingDeque<E>는 링크드 노드 기반의 선택적으로 크기를 제한할 수 있는 블로킹 데크(deque) 예요. 선택적인 용량 제한 생성자 인자는 과도한 확장을 막는 방법이 돼요. 용량을 지정하지 않으면 Integer.MAX_VALUE와 같아요. 링크드 노드는 삽입할 때마다 동적으로 생성되는데, 단 데크가 용량을 초과하게 만들지 않는 경우에만 그래요.
본문
대부분의 연산은 (블로킹에 쓰는 시간을 제외하면) 상수 시간으로 실행돼요. 예외로는 remove, removeFirstOccurrence, removeLastOccurrence, contains, iterator.remove()와 벌크 연산이 있으며, 이들은 모두 선형 시간이에요.
이 클래스와 그 이터레이터는 Collection과 Iterator 인터페이스의 모든 선택적 메서드를 구현해요. Java Collections Framework의 멤버예요.
생성자
LinkedBlockingDeque() — Integer.MAX_VALUE의 용량을 가진 LinkedBlockingDeque를 만들어요.
LinkedBlockingDeque(int capacity) — 주어진 (고정된) 용량을 가진 데크를 만들어요. capacity가 1보다 작으면 IllegalArgumentException을 던져요.
LinkedBlockingDeque(Collection<? extends E> c) — 컬렉션 요소를 이터레이터 순회 순서로 담은 Integer.MAX_VALUE 용량의 데크를 만들어요. 컬렉션이나 요소가 null이면 NullPointerException을 던져요.
양끝 삽입 메서드
void addFirst(E e) / void addLast(E e) — 용량 제한을 위반하지 않고 즉시 삽입해요. 공간이 없으면 IllegalStateException을 던져요. 용량 제한 데크에서는 보통 offerFirst/offerLast가 더 선호돼요.
boolean offerFirst(E e) / boolean offerLast(E e) — 즉시 삽입할 수 있으면 앞/뒤에 넣고 true, 공간이 없으면 false를 반환해요.
void putFirst(E e) throws InterruptedException / void putLast(E e) — 공간이 생길 때까지 필요하면 기다리며 앞/뒤에서 삽입해요.
boolean offerFirst(E e, long timeout, TimeUnit unit) / boolean offerLast(E e, long timeout, TimeUnit unit) — 공간이 생길 때까지 최대 지정 시간만큼 기다리며 삽입해요.
양끝 제거·검색 메서드
E removeFirst() / E removeLast() — 데크의 첫/마지막 요소를 가져와 제거해요. 비어 있으면 NoSuchElementException을 던져요.
E pollFirst() / E pollLast() — 첫/마지막 요소를 가져와 제거하거나 비어 있으면 null을 반환해요.
E takeFirst() / E takeLast() — 필요하면 요소가 생길 때까지 기다리며 첫/마지막 요소를 가져와 제거해요.
E pollFirst(long timeout, TimeUnit unit) / E pollLast(...) — 지정 시간까지 기다리며 첫/마지막 요소를 가져와 제거해요.
E getFirst() / E getLast() — 첫/마지막 요소를 가져오되 제거하지 않아요. 비어 있으면 NoSuchElementException을 던져요.
E peekFirst() / E peekLast() — 첫/마지막 요소를 가져오되 제거하지 않아요. 비어 있으면 null을 반환해요.
boolean removeFirstOccurrence(Object o) / boolean removeLastOccurrence(Object o) — 지정 요소의 첫/마지막 발생을 제거해요.
큐(Queue) 뷰 메서드
boolean add(E e) — addLast와 동일해요. boolean offer(E e) — offerLast와 동일해요. void put(E e) — putLast와 동일해요. boolean offer(E e, long timeout, TimeUnit unit) — 시간 제한 offerLast와 동일해요.
E remove() — removeFirst와 동일해요. E poll() — pollFirst와 동일해요. E take() — takeFirst와 동일해요. E poll(long timeout, TimeUnit unit) — 시간 제한 pollFirst와 동일해요. E element() — getFirst와 동일해요. E peek() — peekFirst와 동일해요.
int remainingCapacity() — 이 데크가 블로킹 없이 이상적으로 받아들일 수 있는 추가 요소 수를 반환해요. 초기 용량에서 현재 size를 뺀 값과 같아요.
int drainTo(Collection<? super E> c) — 사용 가능한 모든 요소를 제거해 주어진 컬렉션에 추가해요.
int drainTo(Collection<? super E> c, int maxElements) — 최대 지정 개수만큼 요소를 옮겨요.
스택(Stack) 메서드
void push(E e) — 데크 헤드에 요소를 푸시해요. addFirst와 동일해요. 공간이 없으면 IllegalStateException을 던져요.
E pop() — 데크 헤드에서 요소를 팝해요. removeFirst와 동일해요. 비어 있으면 NoSuchElementException을 던져요.
기타 메서드
boolean remove(Object o) — 지정 요소의 첫 발생을 제거해요. removeFirstOccurrence와 동일해요.
int size() — 데크의 요소 수를 반환해요.
boolean contains(Object o) — 지정 요소를 포함하면 true를 반환해요.
boolean addAll(Collection<? extends E> c) — 지정 컬렉션의 모든 요소를 데크 끝에 추가해요. 자기 자신에게 addAll하면 IllegalArgumentException을 던져요.
Object[] toArray() / <T> T[] toArray(T[] a) — 요소를 순서대로 담은 배열을 반환해요.
void clear() — 모든 요소를 원자적으로 제거해요.
Iterator<E> iterator() — 순서대로 순회하는 약하게 일관된 이터레이터를 반환해요.
Iterator<E> descendingIterator() — 역순으로 순회하는 약하게 일관된 이터레이터를 반환해요.
Spliterator<E> spliterator() — CONCURRENT, ORDERED, NONNULL을 보고하는 약하게 일관된 Spliterator를 반환해요.
더 알아보기 (Learn more)
- BlockingDeque 인터페이스 — 이 데크가 구현하는 블로킹 데크 계약
- BlockingQueue 인터페이스 — 큐 뷰의 계약
- Deque 인터페이스 — 데크 기본 연산
- Java 공식 API