Queue: 순차적으로 값이 들어오고 나가는 연속적인 데이터들의 집합
A collection designed for holding elements prior to processing.
값을 처리하기전 가지고 있도록 설계된 자료구조
[Java공식문서 중 발췌]
자 이게 무슨말이냐 하면, 값이 순차적으로 들어오고 나가는
FIFO (First In First Out)방식을 쓴다는 이야기다.
예를 들어서 매표소에 기다리고 있는 차례를 기다리고 있는 줄 처럼 말이다
출처: https://coding-factory.tistory.com/602, https://www.freecodecamp.org/news/queue-data-structure-definition-and-java-example-code/
큐(Queue)는?
import java.util.LinkedList;
import java.util.Queue;
//선언 및 구현체 구현
Queue<T> queue = LinkedList<>();
T는 제네릭스(Generics)로 참조타입 이 들어오면 된다
(ex) Integer, String...)
참고로 제네릭스 뒤의 타입추론은 Java7 버전부터 가능해짐!
사용법
//종류
Queue<Integer> queue = new LinkedList<>();
Queue<Integer> queue = new PriorityQueue<>();
Queue<Integer> queue = new ConcurrentLinkedQueue<>();
//노드에 기반한 스레드세이프한 큐
//java util은 멀티스레드 환경에서 critical section에 대한 동기화가 적용되어 있지 않음
//(critical section = 공유자원의 독점을 보장해주는것)
출처: https://sup2is.github.io/2019/09/10/concurrent-linked-queue.html
Queue<Integer> queue = new LinkedBlockingQueue<>();
Queue<Integer> queue = new LinkedTransferQueue<>();
Queue<Integer> queue = new SynchronousQueue<>();
//다른 스레드의 remove요청이 있을때까지 insert할 수 없음 -> 잠깐 머무는 로그를 찍기위해 있는건가?
//peek안됨 -> 삭제하려고 할때만 엘리멘트가 있기 때문
//queued된 스레드가 없으면 poll시 null 반환
//iterate할 것이 없어서 iterate도 안됨
//empty collection처럼 행동함
//등등 사실 몇개 더 있지만, Generic이 Object라서 따로 더 구현을 해줘야 되는것은 포함하지 않음
//DelayQueue 같은 녀석...
boolean add(E e);
boolean offer(E e);
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
Queue<Integer> queue2 = new LinkedList<>();
queue2.offer(1);
queue2.offer(2);
queue2.offer(3);
System.out.println("add queue:" + queue);
System.out.println("offer queue2:" + queue2);
//출력
add queue:[1, 2, 3]
offer queue2:[1, 2, 3]
E poll();
E element();
System.out.println("queue peek: " + queue.peek());
System.out.println("queue element: " + queue.element());
//출력
queue peek: 1
queue element: 1
E remove();
E poll();
System.out.println("queue remove: " + queue.remove());
System.out.println("queue poll: " + queue.poll());
System.out.println("queue: " + queue);
//출력
queue remove: 1
queue poll: 2 //맨 윗값 이였던 1이 빠지고난 이후이므로
queue: [3]
//수행실패시 Exception 발생
add(e) 해당 element 큐에 삽입/true 반환
remove()
element()
//수행실패시 null 또는 false
offer(e)
poll()
peek()