Wie instanziiere ich ein Queue-Objekt in Java?

Lesezeit: 5 Minuten

Benutzer-Avatar
wam090

Wenn ich versuche:

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

Der Compiler gibt mir einen Fehler. Irgendeine Hilfe?

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

Queue ist eine Schnittstelle. Sie können eine Schnittstelle nicht direkt instanziieren, außer über eine anonyme innere Klasse. Typischerweise dies ist nicht was Sie für eine Sammlung tun möchten. Wählen Sie stattdessen eine vorhandene Implementierung aus. Zum Beispiel:

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

oder

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

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

  • Aus ArrayDeque: “Diese Klasse ist wahrscheinlich schneller als Stack, wenn sie als Stapel 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.

    – Wadzim

    30. September 2016 um 18:13 Uhr

Benutzer-Avatar
Edwin Buck

EIN Queue ist eine Schnittstelle, was bedeutet, dass Sie keine konstruieren können Queue direkt.

Die beste Option besteht darin, eine Klasse zu konstruieren, die die bereits implementiert Queue Schnittstelle, wie eine der folgenden: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueueoder SynchronousQueue.

Eine Alternative besteht darin, eine eigene Klasse zu schreiben, die die erforderliche Warteschlangenschnittstelle implementiert. Es ist nicht erforderlich, außer in den seltenen Fällen, in denen Sie etwas Besonderes tun möchten, während Sie den Rest Ihres Programms mit a versorgen 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 seltener verwendete Alternative besteht darin, eine anonyme Klasse zu erstellen, die implementiert Queue. Sie möchten dies wahrscheinlich nicht tun, aber es wird als Option aufgeführt, um alle Grundlagen abzudecken.

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

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

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

    – Tom

    7. Januar 2011 um 23:05 Uhr

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

    – Tom

    7. Januar 2011 um 23:08 Uhr

  • @Tom hat die anonymen Klasseninformationen nicht herausgenommen, da es gut zu wissen ist, dass dies möglich ist, aber ich habe das “Schreiben Sie Ihre eigene Implementierung” davor eingefügt, was es weiter von den zuerst aufgeführten (häufigeren) Alternativen entfernt.

    – Edwin Buck

    10. Januar 2011 um 4:51 Uhr

  • Warum nicht erwähnen ArrayDeque

    – JW.ZG

    11. Dezember 2016 um 22:59 Uhr

  • Ich kann die Methode enqueue() in keiner der von Ihnen erwähnten Klassen finden, ich kann nur die Methode add() finden, bitte korrigieren Sie mich, wenn ich falsch liege.

    – Sreekanth Karumanaghat

    21. Juli 2020 um 9:33 Uhr

Benutzer-Avatar
jmj

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

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

Seit Queue eine Schnittstelle ist, können Sie keine Instanz davon erstellen, wie Sie es veranschaulicht haben

  • java.util.Queue ist eine Schnittstelle. Sie können Schnittstellen nicht instanziieren. Sie müssen eine Instanz einer Klasse erstellen, die diese Schnittstelle implementiert. In diesem Fall ist eine LinkedList eine solche Klasse.

    – Mihai Toader

    7. Januar 2011 um 15:05 Uhr

  • @Tod war ja unterwegs.. 🙂

    – jmj

    7. Januar 2011 um 15:06 Uhr

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

    – Zehra Subas

    7. Juni 2018 um 23:28 Uhr

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

    – jmj

    8. Juni 2018 um 7:30 Uhr


Benutzer-Avatar
zmf

Queue 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.

Geben Sie hier die Bildbeschreibung ein

Die Queue-Schnittstelle erweitert java.util.Collection um zusätzliche Einfügungs-, Extraktions- und Inspektionsoperationen wie:

+offer(element: E): boolesch // 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, löst eine Ausnahme aus, wenn die Warteschlange leer ist.

Beispielcode für die Implementierung von Queue:

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

Benutzer-Avatar
Sujit

Queue ist eine Schnittstelle in Java, das geht 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 sie etwas schneller ist als die andere

Benutzer-Avatar
drac_o

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

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

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, indem Sie die Warteschlangenschnittstelle implementieren.

1344960cookie-checkWie instanziiere ich ein Queue-Objekt in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy