Java에서 Queue 객체를 어떻게 인스턴스화합니까?


142

내가 시도 할 때 :

Queue<Integer> q = new Queue<Integer>();

컴파일러에서 오류가 발생했습니다. 어떤 도움?

또한 대기열을 초기화하려면 대기열의 메소드를 구현해야합니까?


2
스레드 안전 대기열이 필요합니까?
Peter Lawrey

답변:


151

A Queue는 인터페이스이므로 Queue직접 구성 할 수 없습니다 .

최선의 선택은 이미이 구현하는 클래스 오프 구성하는 Queue다음 중 하나와 같은 인터페이스를 : AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, 또는 SynchronousQueue.

대안은 필요한 큐 인터페이스를 구현하는 고유 한 클래스를 작성하는 것입니다. 프로그램의 나머지 부분에을 제공하면서 특별한 작업을 수행하려는 드문 경우를 제외하고는 필요하지 않습니다 Queue.

public class MyQueue<T extends Tree> implements Queue<T> {
   public T element() {
     ... your code to return an element goes here ...
   }

   public boolean offer(T element) {
     ... your code to accept a submission offer goes here ...
   }

   ... etc ...
}

덜 사용되는 대안은 구현하는 익명 클래스를 구성하는 것 Queue입니다. 이 작업을 원하지 않을 수도 있지만 모든베이스를 덮기위한 옵션으로 나열되어 있습니다.

new Queue<Tree>() {
   public Tree element() {
     ...
   };

   public boolean offer(Tree element) {
     ...
   };
   ...
};

21
어머나 ...이 글을 읽는 사람이 익명을 사용할 것 Queue같지만 어쨌든 +1입니다.
Tom

1
사실, Jon 's가 더 명확합니다. 동시성을 언급하고 익명 클래스의 코드를 제거하기 위해 업데이트하면 +1 할 것입니다 ... 거의 확실하지 않기 때문에 무엇을 해야할지 알고 싶은 사람에게는 답이 더 혼란 스럽다고 생각합니다. 그렇게. (자신의 수업을 원하더라도 익명으로 할 필요는 없습니다)
Tom

1
@Tom은 익명 클래스 정보를 얻을 수 없다는 것을 알기 때문에 익명 클래스 정보를 가져 오지 않았지만 먼저 "자신의 구현을 작성하십시오"라는 단어를 첫 번째 나열된 (보다 일반적인) 대안과 멀리 떨어 뜨립니다.
Edwin Buck

1
언급하지 않으 ArrayDeque
시겠습니까

언급 한 클래스에서 enqueue () 메서드를 찾을 수 없습니다. add () 메서드 만 찾을 수 있습니다. 틀린 경우 수정하십시오.
Sreekanth Karumanaghat

152

Queue인터페이스입니다. 익명의 내부 클래스를 통하지 않고 인터페이스를 직접 인스턴스화 할 수 없습니다. 일반적으로 이것은 컬렉션에 대해 수행하려는 것이 아닙니다 . 대신 기존 구현을 선택하십시오. 예를 들면 다음과 같습니다.

Queue<Integer> q = new LinkedList<Integer>();

또는

Queue<Integer> q = new ArrayDeque<Integer>();

일반적으로 관심있는 성능 및 동시성 특성에 따라 컬렉션 구현을 선택합니다.


9
에서 의 ArrayDeque : "이 클래스는 큐으로 사용하면 스택으로 사용, 빠른 LinkedList의 이상의 경우 빠른 스택보다 가능성이 높습니다." CPU 캐시 친화적 인 데이터 로컬 리티와 할당 횟수가 적기 때문입니다.
Vadzim

42
Queue<String> qe=new LinkedList<String>();

qe.add("b");
qe.add("a");
qe.add("c");

Queue인터페이스 이므로 그림과 같이 인스턴스를 만들 수 없습니다


1
java.util.Queue인터페이스입니다. 인터페이스를 인스턴스화 할 수 없습니다. 해당 인터페이스를 구현하는 클래스의 인스턴스를 작성해야합니다. 이 경우 LinkedList는 그러한 클래스입니다.
Mihai Toader

@ 토드 예 예 길에 .. :)
Jigar Joshi

감사합니다 @JigarJoshi !! 스택과 동일한 작업을 수행 할 수있는 방법이 있습니까? 나는 아무것도 찾을 수 없었다.
Zehra Subaş 2016 년

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Jigar Joshi

15

큐는 인터페이스입니다. 큐를 명시 적으로 구성 할 수 없습니다. 구현 클래스 중 하나를 인스턴스화해야합니다. 다음과 같은 것 :

Queue linkedList = new LinkedList();

다음은이 주제에 대한 Java 학습서 링크입니다.


이것은 더 이상 작동하지 않습니다 ..! 이 선언은 작동하지만-> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal

@MdFaisal Java 버전 "1.7.0_71"에서 저에게 잘 작동
zmf

12

여기에 이미지 설명을 입력하십시오

큐 인터페이스는 다음과 같은 추가 삽입, 추출 및 검사 조작으로 java.util.Collection을 확장합니다.

+offer(element: E):boolean // 요소 삽입

+poll(): E // 큐가 비어 있으면 요소를 검색하고 NULL을 반환합니다.

+remove(): E// 요소를 가져 와서 제거하고 큐가 비어 있으면 예외를 던집니다.

+peek(): E// 이 큐의 헤드를 검색하지만 제거하지는 않으며이 큐가 비어 있으면 null을 반환합니다.

+element(): E // 큐가 비어 있으면이 큐의 헤드를 검색하지만 제거하지는 않습니다.

큐 구현을위한 예제 코드 :

java.util.Queue<String> queue = new LinkedList<>();
queue.offer("Hello");
queue.offer("StackOverFlow");
queue.offer("User");

System.out.println(queue.peek());

while (queue.size() > 0){
    System.out.println(queue.remove() + " ");
}
//Since Queue is empty now so this will return NULL
System.out.println(queue.peek());

코드 출력 :

Hello
Hello 
StackOverFlow 
User 
null

7

큐는 자바의 인터페이스이므로 그렇게 할 수 없습니다.

대신 두 가지 옵션이 있습니다.

옵션 1:

Queue<Integer> Q = new LinkedList<>();

옵션 2 :

Queue<Integer> Q = new ArrayDeque<>();

option2는 다른 것보다 약간 빠르므로 사용하는 것이 좋습니다.


5

Java의 큐 는 인터페이스로 정의되며 JDK 릴리스의 일부로 즉시 사용 가능한 구현이 있습니다. 여기에 몇 가지 : LinkedList의 , 우선 순위 대기열에 ArrayBlockingQueue, ConcurrentLinkedQueue를, 링크 전송 큐, 동기 큐

SO이 클래스 중 하나를 작성하여 큐 참조로 보유 할 수 있습니다. 예를 들어

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {

 public static void main (String[] args) {
  Queue que = new LinkedList();
  que.add("first");
  que.offer("second");
  que.offer("third");
  System.out.println("Queue Print:: " + que);
  
  String head = que.element();
  System.out.println("Head element:: " + head);
  
  String element1 = que.poll();
  System.out.println("Removed Element:: " + element1);
  
  System.out.println("Queue Print after poll:: " + que);
  String element2 = que.remove();
  System.out.println("Removed Element:: " + element2);
  
  System.out.println("Queue Print after remove:: " + que);  
 }
}

대기열 인터페이스를 구현하는 사용자 지정 대기열을 구현할 수도 있습니다.


4

QueueJava의 인터페이스이므로 그렇게 할 수 없습니다. 시험:

Queue<Integer> Q = new LinkedList<Integer>();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.