logo

Java의 대기열 인터페이스

대기열 인터페이스는 다음 위치에 있습니다. java.util 패키지를 확장하고 컬렉션 인터페이스 FIFO(선입선출) 순서로 처리될 요소를 보유하는 데 사용됩니다. 목록 끝에 요소를 삽입하고 목록 시작 부분에서 요소를 삭제하는 것으로 제한된 용도로 사용되는 개체의 순서가 지정된 목록입니다. FIFO 또는 선입선출 원칙.

Queue-Deque-PriorityQueue-In-Java

인터페이스이기 때문에 큐에는 선언을 위한 구체적인 클래스가 필요하며 가장 일반적인 클래스는 다음과 같습니다. 우선순위 대기열 그리고 링크드리스트 자바에서. 이러한 구현 중 어느 것도 스레드로부터 안전하지 않습니다. 우선순위차단큐 스레드로부터 안전한 구현이 필요한 경우 대체 구현 중 하나입니다.



선언: Queue 인터페이스는 다음과 같이 선언됩니다.

public interface Queue extends Collection>

대기열 개체 생성: 부터 대기줄 이다 상호 작용 , 대기열 유형의 개체를 만들 수 없습니다. 객체를 생성하려면 항상 이 목록을 확장하는 클래스가 필요합니다. 또한, 도입 이후에는 제네릭 Java 1.5에서는 대기열에 저장할 수 있는 객체 유형을 제한하는 것이 가능합니다. 이 유형 안전 큐는 다음과 같이 정의할 수 있습니다.

// Obj is the type of the object to be stored in Queue  Queue queue = new PriorityQueue ();>

Java에서 Queue 인터페이스는 Collection 인터페이스의 하위 유형이며 특정 순서로 요소 컬렉션을 나타냅니다. 이는 FIFO(선입선출) 원칙을 따릅니다. 즉, 요소가 큐에 추가된 순서대로 검색됩니다.

Queue 인터페이스는 대기열의 요소를 추가, 제거 및 검사하기 위한 여러 메서드를 제공합니다. 가장 일반적으로 사용되는 방법은 다음과 같습니다.

add(element): 대기열의 뒤쪽에 요소를 추가합니다. 대기열이 가득 차면 예외가 발생합니다.

Offer(element): 대기열 뒤쪽에 요소를 추가합니다. 대기열이 가득 차면 false를 반환합니다.

Remove(): 대기열의 맨 앞에 있는 요소를 제거하고 반환합니다. 대기열이 비어 있으면 예외가 발생합니다.

poll(): 큐의 맨 앞에 있는 요소를 제거하고 반환합니다. 대기열이 비어 있으면 null을 반환합니다.

element(): 대기열의 맨 앞에 있는 요소를 제거하지 않고 반환합니다. 대기열이 비어 있으면 예외가 발생합니다.

peek(): 대기열의 맨 앞에 있는 요소를 제거하지 않고 반환합니다. 대기열이 비어 있으면 null을 반환합니다.

Queue 인터페이스는 LinkedList, ArrayDeque 및 PriorityQueue를 포함하여 Java의 여러 클래스에 의해 구현됩니다. 이러한 각 클래스는 다양한 성능 특성과 기능을 갖춘 다양한 대기열 인터페이스 구현을 제공합니다.

전반적으로 Queue 인터페이스는 특정 순서로 요소 컬렉션을 관리하는 데 유용한 도구이며 다양한 응용 프로그램 및 산업에서 널리 사용됩니다.

예:

자바




import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> >public> static> void> main(String[] args) {> >Queue queue =>new> LinkedList();> >// add elements to the queue> >queue.add(>'apple'>);> >queue.add(>'banana'>);> >queue.add(>'cherry'>);> >// print the queue> >System.out.println(>'Queue: '> + queue);> >// remove the element at the front of the queue> >String front = queue.remove();> >System.out.println(>'Removed element: '> + front);> >// print the updated queue> >System.out.println(>'Queue after removal: '> + queue);> >// add another element to the queue> >queue.add(>'date'>);> >// peek at the element at the front of the queue> >String peeked = queue.peek();> >System.out.println(>'Peeked element: '> + peeked);> >// print the updated queue> >System.out.println(>'Queue after peek: '> + queue);> >}> }>

>

>

산출

Queue: [apple, banana, cherry] Removed element: apple Queue after removal: [banana, cherry] Peeked element: banana Queue after peek: [banana, cherry, date]>

예: 대기줄

자바




자바의 소수 프로그램

// Java program to demonstrate a Queue> import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> >public> static> void> main(String[] args)> >{> >Queue q> >=>new> LinkedList();> >// Adds elements {0, 1, 2, 3, 4} to> >// the queue> >for> (>int> i =>0>; i <>5>; i++)> >q.add(i);> >// Display contents of the queue.> >System.out.println(>'Elements of queue '> >+ q);> >// To remove the head of queue.> >int> removedele = q.remove();> >System.out.println(>'removed element-'> >+ removedele);> >System.out.println(q);> >// To view the head of queue> >int> head = q.peek();> >System.out.println(>'head of queue-'> >+ head);> >// Rest all methods of collection> >// interface like size and contains> >// can be used with this> >// implementation.> >int> size = q.size();> >System.out.println(>'Size of queue-'> >+ size);> >}> }>

>

>

산출

Elements of queue [0, 1, 2, 3, 4] removed element-0 [1, 2, 3, 4] head of queue-1 Size of queue-4>

대기열 인터페이스 작업

다음을 사용하여 대기열에서 자주 사용되는 몇 가지 작업을 수행하는 방법을 살펴보겠습니다. 우선순위 대기열 클래스 .

1. 요소 추가: 큐에 요소를 추가하기 위해 다음을 사용할 수 있습니다. add() 메소드 . 게재 신청서는 PriorityQueue에 유지되지 않습니다. 요소는 기본적으로 오름차순인 우선순위에 따라 저장됩니다.

자바




// Java program to add elements> // to a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >System.out.println(pq);> >}> }>

>

>

산출

[For, Geeks, Geeks]>

2. 요소 제거: 큐에서 요소를 제거하려면 다음을 사용할 수 있습니다. 제거() 메소드. 그러한 객체가 여러 개 있는 경우 해당 객체의 첫 번째 발생이 제거됩니다. 그 외에도 헤드를 제거하고 반환하는 데에도 poll() 메서드가 사용됩니다.

자바




// Java program to remove elements> // from a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >System.out.println(>'Initial Queue '> + pq);> >pq.remove(>'Geeks'>);> >System.out.println(>'After Remove '> + pq);> >System.out.println(>'Poll Method '> + pq.poll());> >System.out.println(>'Final Queue '> + pq);> >}> }>

>

클라우드 컴퓨팅 애플리케이션
>

산출

Initial Queue [For, Geeks, Geeks] After Remove [For, Geeks] Poll Method For Final Queue [Geeks]>

3. 대기열 반복: 대기열을 반복하는 방법에는 여러 가지가 있습니다. 가장 유명한 방법은 대기열을 배열로 변환하고 for 루프를 사용하여 순회하는 것입니다. 그러나 큐에는 큐를 반복하는 데 사용할 수 있는 내장 반복자가 있습니다.

자바




// Java program to iterate elements> // to a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >Iterator iterator = pq.iterator();> >while> (iterator.hasNext()) {> >System.out.print(iterator.next() +>' '>);> >}> >}> }>

>

>

산출

For Geeks Geeks>

대기열의 특성: 큐의 특징은 다음과 같습니다.

  • 대기열은 대기열 끝에 요소를 삽입하는 데 사용되며 대기열의 시작 부분에서 제거됩니다. FIFO 개념을 따릅니다.
  • Java Queue는 삽입, 삭제 등을 포함한 Collection 인터페이스의 모든 메소드를 지원합니다.
  • 링크드리스트 , ArrayBlockingQueue 및 우선순위 대기열 가장 자주 사용되는 구현입니다.
  • BlockingQueues에서 null 작업이 수행되면 NullPointerException이 발생합니다.
  • java.util 패키지에서 사용 가능한 대기열은 제한되지 않은 대기열입니다.
  • java.util.concurrent 패키지에서 사용 가능한 대기열은 제한된 대기열입니다.
  • Deque를 제외한 모든 대기열은 각각 대기열의 꼬리와 머리에서 삽입 및 제거를 지원합니다. Deques는 양쪽 끝에서 요소 삽입 및 제거를 지원합니다.

대기열 인터페이스를 구현하는 클래스:

1. 우선순위 대기열: 컬렉션 프레임워크에 구현된 PriorityQueue 클래스는 우선순위에 따라 객체를 처리하는 방법을 제공합니다. 대기열은 선입선출(First-In-First-Out) 알고리즘을 따르는 것으로 알려져 있지만 때때로 대기열의 요소를 우선순위에 따라 처리해야 할 때가 있는데, 이때 PriorityQueue가 작동합니다. 이 클래스를 사용하여 대기열 객체를 생성하는 방법을 살펴보겠습니다.

자바




// Java program to demonstrate the> // creation of queue object using the> // PriorityQueue class> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty priority queue> >Queue pQueue> >=>new> PriorityQueue();> >// Adding items to the pQueue> >// using add()> >pQueue.add(>10>);> >pQueue.add(>20>);> >pQueue.add(>15>);> >// Printing the top element of> >// the PriorityQueue> >System.out.println(pQueue.peek());> >// Printing the top element and removing it> >// from the PriorityQueue container> >System.out.println(pQueue.poll());> >// Printing the top element again> >System.out.println(pQueue.peek());> >}> }>

>

>

산출

임의의 SQL로 주문
10 10 15>

2. 연결 목록: LinkedList는 본질적으로 다음을 구현하는 컬렉션 프레임워크에서 구현되는 클래스입니다.

자바




// Java program to demonstrate the> // creation of queue object using the> // LinkedList class> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty LinkedList> >Queue ll> >=>new> LinkedList();> >// Adding items to the ll> >// using add()> >ll.add(>10>);> >ll.add(>20>);> >ll.add(>15>);> >// Printing the top element of> >// the LinkedList> >System.out.println(ll.peek());> >// Printing the top element and removing it> >// from the LinkedList container> >System.out.println(ll.poll());> >// Printing the top element again> >System.out.println(ll.peek());> >}> }>

>

>

산출

10 10 20>

삼. 우선순위차단큐: PriorityQueue 및 LinkedList 구현 모두 스레드로부터 안전하지 않습니다. PriorityBlockingQueue는 스레드로부터 안전한 구현이 필요한 경우 대체 구현 중 하나입니다. PriorityBlockingQueue는 클래스와 동일한 순서 규칙을 사용하는 무제한 차단 대기열입니다. 우선순위 대기열 차단 검색 작업을 제공합니다.
제한이 없기 때문에 리소스 소모로 인해 요소 추가가 실패하는 경우가 있습니다. 메모리 부족오류 . 이 클래스를 사용하여 대기열 객체를 생성하는 방법을 살펴보겠습니다.

자바


삽입 정렬 자바



// Java program to demonstrate the> // creation of queue object using the> // PriorityBlockingQueue class> import> java.util.concurrent.PriorityBlockingQueue;> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty priority> >// blocking queue> >Queue pbq> >=>new> PriorityBlockingQueue();> >// Adding items to the pbq> >// using add()> >pbq.add(>10>);> >pbq.add(>20>);> >pbq.add(>15>);> >// Printing the top element of> >// the PriorityBlockingQueue> >System.out.println(pbq.peek());> >// Printing the top element and> >// removing it from the> >// PriorityBlockingQueue> >System.out.println(pbq.poll());> >// Printing the top element again> >System.out.println(pbq.peek());> >}> }>

>

>

산출

10 10 15>

대기열 인터페이스 방법

대기열 인터페이스는 대기열 인터페이스에 있는 모든 메서드를 상속합니다. 컬렉션 인터페이스 다음 방법을 구현하는 동안:

방법

설명

add(int 인덱스, 요소) 이 메소드는 큐의 특정 인덱스에 요소를 추가하는 데 사용됩니다. 단일 매개변수가 전달되면 단순히 대기열 끝에 요소를 추가합니다.
addAll(int 인덱스, 컬렉션 컬렉션) 이 메소드는 지정된 컬렉션의 모든 요소를 ​​큐에 추가하는 데 사용됩니다. 단일 매개변수가 전달되면 지정된 컬렉션의 모든 요소가 대기열 끝에 추가됩니다.
크기() 이 메소드는 큐의 크기를 반환하는 데 사용됩니다.
분명한() 이 메서드는 대기열의 모든 요소를 ​​제거하는 데 사용됩니다. 그러나 생성된 큐의 참조는 계속 저장됩니다.
제거하다() 이 메소드는 큐의 맨 앞에서 요소를 제거하는 데 사용됩니다.
제거(int 인덱스) 이 메서드는 지정된 인덱스에서 요소를 제거합니다. 후속 요소(있는 경우)를 왼쪽으로 이동하고 해당 인덱스를 1씩 감소시킵니다.
제거(요소) 이 메소드는 큐에서 주어진 요소의 첫 번째 발생을 제거하고 반환하는 데 사용됩니다.
get(정수 인덱스) 이 메서드는 지정된 인덱스의 요소를 반환합니다.
set(int 인덱스, 요소) 이 메서드는 지정된 인덱스의 요소를 새 요소로 바꿉니다. 이 함수는 방금 새 요소로 대체된 요소를 반환합니다.
indexOf(요소) 이 메소드는 주어진 요소의 첫 번째 발생을 반환합니다. -1 요소가 대기열에 존재하지 않는 경우.
lastIndexOf(요소) 이 메소드는 주어진 요소의 마지막 발생을 반환합니다. -1 요소가 대기열에 존재하지 않는 경우.
같음(요소) 이 메서드는 지정된 요소와 대기열 요소의 동일성을 비교하는 데 사용됩니다.
해시 코드() 이 메소드는 주어진 큐의 해시코드 값을 반환하는 데 사용됩니다.
비었다() 이 메소드는 큐가 비어 있는지 확인하는 데 사용됩니다. 대기열이 비어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
포함(요소) 이 메소드는 큐에 지정된 요소가 포함되어 있는지 확인하는 데 사용됩니다. 대기열에 요소가 포함되어 있으면 true를 반환합니다.
containAll(컬렉션 컬렉션) 이 메소드는 큐에 모든 요소 컬렉션이 포함되어 있는지 확인하는 데 사용됩니다.
sort(비교기 비교) 이 메소드는 주어진 기준에 따라 큐의 요소를 정렬하는 데 사용됩니다. 비교기 .
부울 추가(객체) 이 메서드는 지정된 요소를 대기열에 삽입하고 성공 시 true를 반환하는 데 사용됩니다.
부울 제안(객체) 이 메소드는 지정된 요소를 큐에 삽입하는 데 사용됩니다.
객체 폴링() 이 메소드는 대기열의 헤드를 검색 및 제거하는 데 사용되며, 대기열이 비어 있으면 null을 반환합니다.
객체요소() 이 메소드는 큐의 헤드를 검색하는 데 사용되지만 제거하지는 않습니다.
객체 엿보기() 이 메소드는 이 큐의 헤드를 검색하는 데 사용되지만 제거하지는 않습니다. 또는 이 큐가 비어 있는 경우 null을 반환합니다.

Java에서 Queue 인터페이스를 사용하면 다음과 같은 이점이 있습니다.

주문 보존 : Queue 인터페이스는 FIFO(선입선출) 원칙에 따라 특정 순서로 요소를 저장하고 검색하는 방법을 제공합니다.

유연성 : Queue 인터페이스는 Collection 인터페이스의 하위 유형입니다. 즉, 애플리케이션의 요구 사항에 따라 다양한 데이터 구조 및 알고리즘과 함께 사용할 수 있습니다.

안전 : java.util.concurrent.ConcurrentLinkedQueue 클래스와 같은 Queue 인터페이스의 일부 구현은 스레드로부터 안전합니다. 즉, 충돌을 일으키지 않고 여러 스레드에서 동시에 액세스할 수 있습니다.

성능 : Queue 인터페이스는 요소 추가, 제거 및 검사를 위한 효율적인 구현을 제공하므로 성능이 중요한 애플리케이션에서 요소 컬렉션을 관리하는 데 유용한 도구입니다.

Java에서 Queue 인터페이스를 사용할 때의 단점:

제한된 기능: Queue 인터페이스는 특정 순서로 요소 컬렉션을 관리하기 위해 특별히 설계되었습니다. 즉, 더 복잡한 데이터 구조나 알고리즘에는 적합하지 않을 수 있습니다.

크기 제한: ArrayDeque 클래스와 같은 일부 Queue 인터페이스 구현은 고정된 크기를 가지므로 특정 요소 수 이상으로 커질 수 없습니다.

메모리 사용량: 구현에 따라 Queue 인터페이스는 다른 데이터 구조보다 더 많은 메모리를 요구할 수 있으며, 특히 요소 순서에 대한 추가 정보를 저장해야 하는 경우 더욱 그렇습니다.

복잡성 : Queue 인터페이스는 초보 프로그래머가 사용하고 이해하기 어려울 수 있습니다. 특히 데이터 구조 및 알고리즘의 원리에 익숙하지 않은 경우 더욱 그렇습니다.