대부분의 사람들에게 "대기열"이라는 단어는 기분 좋은 연상을 거의 떠올리지 않습니다. 그러나 오늘 우리는 다른 대기열인 Java 대기열에 대해 이야기하고 있습니다. Java에서 큐는 Queue 인터페이스를 상속하고 Collection 인터페이스를 확장하는 모든 것입니다 . 즉, 대기열을 컬렉션처럼 취급할 수 있습니다.
Java의 대기열은 FIFO 및 LIFO 라는 두 가지 작동 원리를 지원합니다 .
FIFO (First In, First Out) 원칙은 일반 대기열을 제어합니다. 대기열에 추가된 첫 번째 요소가 가장 먼저 대기열에서 나갑니다 .
LIFO (Last In, First Out) 원칙은 스택의 동작을 설명합니다. 큐에 마지막으로 추가된 요소가 가장 먼저 스택을 떠납니다 . 예를 들어, 카드 덱으로 작업하는 방법은 다음과 같습니다. 덱 맨 아래에 도달할 때까지 한 번에 맨 위에서 카드를 제거합니다.
Java의 대기열 계층 구조 는 다음과 같습니다.
여기에서 Queue에는 LinkedList , ArrayDeque 및 PriorityQueue 의 3가지 구현 클래스가 있음을 알 수 있습니다 . LinkedList 및 ArrayDeque는 Queue 가 아니라 Deque를 직접 상속합니다 .
Deque 는 Java 6에 추가된 인터페이스입니다. 여기에는 대기열에 유용한 여러 메서드가 포함되어 있으며 대기열이 양방향(또는 양방향) 대기열로 작동할 수 있습니다. 즉,FIFO및LIFO.
Deque 인터페이스의 두 자손 중 하나는 ArrayDeque 입니다 . 양방향 대기열을 지원하여 양쪽 끝에서 요소를 삽입하고 제거할 수 있습니다. 크기가 자동으로 커지는 동적 배열이기도 합니다.
Queue 의 직계 후손인 PriorityQueue 클래스 도 있습니다 . 이 클래스는 Deque를 구현하는 클래스와 다르게 작동합니다 .
PriorityQueue 는 기본적으로 자연 순서에 따라 요소를 구성하는 우선순위 대기열입니다. 여기서 정렬은 Comparable 및 Comparator 인터페이스를 사용합니다. 원칙은 TreeSet 또는 TreeMap — Comparable 인터페이스를 사용하고 고유한 정렬 순서를 갖는와 동일합니다
PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));
priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
이 예제를 실행하면 콘솔에 다음과 같은 내용이 표시됩니다.
존
앤드류
정규 컬렉션이 아닌 큐로 작업하고 있으므로 목록에서 요소를 제거해야 합니다. 이를 위해 다음 구조를 사용합니다.
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
Deque 인터페이스는 Queue 메서드를 상속 하고 몇 가지 흥미로운 자체 메서드를 추가합니다 .
무효 addFirst(E obj) | 대기열 앞에 obj 요소를 추가합니다. |
무효 addLast(E obj) | 대기열 끝에 obj 요소를 추가합니다. |
전자 getFirst() | 대기열에서 첫 번째 요소를 반환합니다. |
전자 getLast() | 대기열에서 마지막 요소를 반환합니다. |
부울 offerFirst(E obj) | obj 요소를 대기열 앞에 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 . |
부울 offerLast(E obj) | 대기열 끝에 obj 요소를 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 . |
전자() | 대기열에서 첫 번째 요소를 가져와서 제거합니다. |
무효 푸시(E obj) | 대기열 앞에 obj 요소를 추가합니다. |
전자 엿보기() | 대기열에서 첫 번째 요소를 반환하지만 제거하지는 않습니다. |
E 엿보기마지막() | 대기열에서 마지막 요소를 반환하지만 제거하지는 않습니다. |
E pollFirst() | 대기열에서 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 . |
설문마지막() | 대기열에서 마지막 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 . |
E 제거마지막() | 대기열의 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다. |
전자 removeFirst() | 대기열의 마지막 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다. |
부울 removeFirstOccurrence(객체 객체) | 대기열에서 obj 의 첫 번째 항목을 제거합니다. |
부울 removeLastOccurrence(개체 객체) | 대기열에서 obj 의 마지막 항목을 제거합니다. |
이제 이러한 방법 중 몇 가지를 실제로 살펴보겠습니다.
먼저 큐에 요소를 추가해 보겠습니다.
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple"); // Adds "Apple" to the end of the queue
deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
System.out.println(deque);
이제 대기열에서 값을 가져옵니다.
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
System.out.println("The first element is: "+ deque.getFirst());
System.out.println("The last element is: " + deque.getLast());
}
이 코드는 대기열의 첫 번째 요소와 마지막 요소를 표시합니다.
마지막 요소: 파인애플
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue
System.out.println(deque);
이 코드를 실행하면 다음을 얻습니다.
애플
[파인애플,레몬]
pop() 과 poll() 의 차이점은 목록이 빈 목록인 경우 pop()은 NoSuchElementException을 발생시키지만 poll()은 null을 반환한다는 것 입니다 .
이제 pollFirst() 및 pollLast() 메서드를 살펴보겠습니다 .
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
레몬
[사과, 파인애플]
두 메서드 모두 대기열에서 값을 반환하고 제거합니다.
다음은 peekFirst() 및 peekLast() 메서드를 사용하는 예입니다 .
Deque<String> friends = new ArrayDeque<>();
friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");
System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());
System.out.println(friends);
마지막 요소: Oliver
[John, Rob, Greg, Max, Oliver]
두 메서드 모두 대기열에서 첫 번째/마지막 요소를 반환하고 제거하지 않습니다. 대기열이 비어 있으면 null이 반환됩니다.
잘하셨어요! 오늘 우리는 Java에서 대기열을 사용하는 방법을 배웠습니다. 이제 실제로 사용하는 방법을 알았습니다.
GO TO FULL VERSION