Wie instanziiere ich ein Queue-Objekt in Java?


142

Wenn ich es versuche:

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

Der Compiler gibt mir einen Fehler. Irgendeine Hilfe?

Wenn ich eine Warteschlange initialisieren möchte, muss ich dann die Methoden der Warteschlange implementieren?


2
Benötigen Sie die Warteschlange, um threadsicher zu sein?
Peter Lawrey

Antworten:


150

A Queueist eine Schnittstelle, dh Sie können keine Queuedirekt erstellen .

Die beste Möglichkeit ist , eine Klasse zu konstruieren aus , dass bereits die implementiert QueueSchnittstelle, wie eine der folgenden: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, oder SynchronousQueue.

Eine Alternative besteht darin, eine eigene Klasse zu schreiben, die die erforderliche Warteschlangenschnittstelle implementiert. Es wird nicht benötigt, außer in den seltenen Fällen, in denen Sie etwas Besonderes tun möchten, während Sie dem Rest Ihres Programms eine 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 ...
}

Eine noch weniger verwendete Alternative besteht darin, eine anonyme Klasse zu erstellen, die implementiert wird Queue. Sie möchten dies wahrscheinlich nicht tun, aber es wird als Option aufgeführt, um alle Basen abzudecken.

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

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

21
Oh je ... Ich fürchte, jemand, der dies liest, wird einen anonymen verwenden Queue... aber trotzdem +1.
Tom

1
Eigentlich ist Jon's klarer. Ich werde dies +1 geben, wenn Sie es aktualisieren, um die Parallelität zu erwähnen und den Code für anonyme Klassen loszuwerden ... Ich denke, dies macht die Antwort für jemanden verwirrender, der wissen möchte, was zu tun ist, weil er es mit ziemlicher Sicherheit nicht will TU das. (Auch wenn sie ihre eigene Klasse wollten, besteht keine Notwendigkeit, sie anonym zu machen)
Tom

1
@Tom hat die anonymen Klasseninformationen nicht herausgenommen, da es gut ist zu wissen, dass dies möglich ist, aber ich habe davor "Write your own Implementation" eingefügt, um sie weiter von den ersten aufgeführten (häufigeren) Alternativen zu entfernen.
Edwin Buck

1
Warum nicht erwähnenArrayDeque
JW.ZG

Ich kann die enqueue () -Methode in keiner der von Ihnen genannten Klassen finden. Ich kann nur die add () -Methode finden. Bitte korrigieren Sie mich, wenn ich falsch liege.
Sreekanth Karumanaghat vor

152

Queueist eine Schnittstelle. Sie können eine Schnittstelle nur über eine anonyme innere Klasse direkt instanziieren. Normalerweise ist dies nicht das, was Sie für eine Sammlung tun möchten. Wählen Sie stattdessen eine vorhandene Implementierung. Beispielsweise:

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

oder

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

In der Regel wählen Sie eine Sammlungsimplementierung anhand der Leistungs- und Parallelitätsmerkmale aus, an denen Sie interessiert sind.


9
Von ArrayDeque : "Diese Klasse ist wahrscheinlich schneller als Stack, wenn sie als Stack verwendet wird, und schneller als LinkedList, wenn sie als Warteschlange verwendet wird." Dies liegt an der CPU-Cache-freundlichen Datenlokalität und weniger häufigen Zuweisungen.
Vadzim

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

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

Da Queuees sich um eine Schnittstelle handelt, können Sie keine Instanz davon erstellen, wie Sie dargestellt haben


1
java.util.Queueist eine Schnittstelle. Sie können keine Schnittstellen instanziieren. Sie müssen eine Instanz einer Klasse erstellen, die diese Schnittstelle implementiert. In diesem Fall ist eine LinkedList eine solche Klasse.
Mihai Toader

@Tod ja war unterwegs .. :)
Jigar Joshi

Danke @JigarJoshi !! Gibt es eine Möglichkeit, dasselbe mit Stack zu tun? Ich konnte nichts finden.
Zehra Subaş

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

15

Die Warteschlange ist eine Schnittstelle. Sie können eine Warteschlange nicht explizit erstellen. Sie müssen eine der implementierenden Klassen instanziieren. Etwas wie:

Queue linkedList = new LinkedList();

Hier ist ein Link zum Java-Tutorial zu diesem Thema.


das funktioniert nicht mehr ..! Obwohl diese Deklaration funktioniert -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal

@ MDFaisal Funktioniert gut für mich mit Java-Version "1.7.0_71"
zmf

12

Geben Sie hier die Bildbeschreibung ein

Die Warteschlangenschnittstelle erweitert java.util.Collection um zusätzliche Einfüge-, Extraktions- und Inspektionsvorgänge wie:

+offer(element: E):boolean // Einfügen eines Elements

+poll(): E // Ruft das Element ab und gibt NULL zurück, wenn die Warteschlange leer ist

+remove(): E// Ruft das Element ab und entfernt es und löst eine Ausnahme aus, wenn die Warteschlange leer ist

+peek(): E// Ruft den Kopf dieser Warteschlange ab, entfernt ihn jedoch nicht und gibt null zurück, wenn diese Warteschlange leer ist.

+element(): E// Ruft den Kopf dieser Warteschlange ab, entfernt ihn jedoch nicht und löst eine Ausnahme aus, wenn die Warteschlange leer ist.

Beispielcode für die Implementierung der Warteschlange:

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());

Ausgabe des Codes:

Hello
Hello 
StackOverFlow 
User 
null

7

Queue ist eine Schnittstelle in Java, das können Sie nicht.

Stattdessen haben Sie zwei Möglichkeiten:

Option 1:

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

Option 2:

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

Ich empfehle die Verwendung von Option2, da diese etwas schneller als die andere ist


5

Die Warteschlange in Java ist als Schnittstelle definiert und viele gebrauchsfertige Implementierungen sind als Teil der JDK-Version vorhanden. Hier sind einige: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Linked Transfer Queue, Synchronous Queue usw.

SO Sie können jede dieser Klassen erstellen und als Warteschlangenreferenz speichern. beispielsweise

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);  
 }
}

Sie können auch Ihre eigene benutzerdefinierte Warteschlange implementieren, die die Warteschlangenschnittstelle implementiert.


4

Queueist eine Schnittstelle in Java, das konnte man nicht machen. Versuchen:

Queue<Integer> Q = new LinkedList<Integer>();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.