Come posso creare un'istanza di un oggetto Queue in Java?


Risposte:


151

A Queueè un'interfaccia, il che significa che non è possibile costruirne uno Queuedirettamente.

L'opzione migliore è quello di costruire fuori una classe che già implementa l' Queueinterfaccia, come una delle seguenti: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, o SynchronousQueue.

Un'alternativa è scrivere la propria classe che implementa l'interfaccia Queue necessaria. Non è necessario tranne nei rari casi in cui desideri fare qualcosa di speciale fornendo al resto del tuo programma un 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 ...
}

Un'alternativa ancora meno utilizzata è quella di costruire una classe anonima che implementa Queue. Probabilmente non vuoi farlo, ma è elencato come un'opzione per il bene di coprire tutte le basi.

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

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

21
Oh caro ... temo che qualcuno leggendo questo userà un anonimo Queue... ma +1 comunque.
Tom,

1
In realtà, Jon è più chiaro. Lo farò +1 se lo aggiorni per menzionare la concorrenza e mi sbarazzo del codice per le classi anonime ... Penso che renda la risposta più confusa per qualcuno che vuole sapere cosa fare perché quasi sicuramente non vogliono Fai quello. (Anche se volessero la propria classe, non è necessario renderla anonima)
Tom,

1
@ Tom non ha eliminato le informazioni anonime sulla classe in quanto è utile sapere che è possibile, ma ho inserito prima "Scrivi la tua implementazione" che le distanzia ulteriormente dalle prime alternative (più comuni) elencate.
Edwin Buck,

1
Perché non menzionareArrayDeque
JW.ZG l'

Non riesco a trovare il metodo enqueue () in nessuna delle classi che hai citato, sono solo in grado di trovare il metodo add (), per favore correggimi se sbaglio.
Sreekanth Karumanaghat il

152

Queueè un'interfaccia. Non è possibile creare un'istanza di un'interfaccia direttamente se non tramite una classe interna anonima. In genere questo non è quello che vuoi fare per una collezione. Invece, scegli un'implementazione esistente. Per esempio:

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

o

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

In genere si sceglie un'implementazione della raccolta in base alle caratteristiche di prestazioni e concorrenza a cui si è interessati.


9
Da ArrayDeque : "È probabile che questa classe sia più veloce di Stack quando utilizzata come stack e più veloce di LinkedList se utilizzata come coda". È dovuto alla localizzazione dei dati ottimizzata per la cache della CPU e alle allocazioni meno frequenti.
Vadzim,

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

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

Poiché Queueè un'interfaccia, non è possibile crearne un'istanza come illustrato


1
java.util.Queueè un'interfaccia. Non puoi istanziare le interfacce. È necessario creare un'istanza di una classe che implementa tale interfaccia. In questo caso, un LinkedList è una tale classe.
Mihai Toader,

@Tod sì era in arrivo .. :)
Jigar Joshi

Grazie @JigarJoshi !! c'è un modo per fare la stessa cosa con lo stack? Non sono riuscito a trovare nulla.
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

La coda è un'interfaccia; non è possibile costruire esplicitamente una coda. Dovrai istanziare una delle sue classi di implementazione. Qualcosa di simile a:

Queue linkedList = new LinkedList();

Ecco un link al tutorial Java su questo argomento.


questo non funziona più ..! Sebbene questa dichiarazione funzioni -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal,

@MdFaisal Funziona bene per me con la versione java "1.7.0_71"
zmf

12

inserisci qui la descrizione dell'immagine

L'interfaccia Queue estende java.util.Collection con ulteriori operazioni di inserimento, estrazione e ispezione come:

+offer(element: E):booleano // Inserimento di un elemento

+poll(): E // Recupera l'elemento e restituisce NULL se la coda è vuota

+remove(): E// Recupera e rimuove l'elemento e genera un'eccezione se la coda è vuota

+peek(): E// Recupera, ma non rimuove, l'intestazione di questa coda, restituendo null se questa coda è vuota.

+element(): E// Recupera, ma non rimuove, il capo di questa coda, genera un'eccezione se la coda è vuota.

Codice di esempio per l'implementazione della coda:

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

Uscita del codice:

Hello
Hello 
StackOverFlow 
User 
null

7

La coda è un'interfaccia in Java, non puoi farlo.

Invece hai due opzioni:

opzione 1:

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

opzione 2:

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

Consiglio di usare option2 in quanto è un po 'più veloce dell'altro


5

La coda in Java è definita come un'interfaccia e molte implementazioni pronte per l'uso sono presenti come parte della versione JDK. Eccone alcuni: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Queue Transfer Transfer Queue, Synchronous Queue ecc.

SO È possibile creare una di queste classi e conservarla come riferimento per la coda. per esempio

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

È anche possibile implementare la propria coda personalizzata implementando l'interfaccia Coda.


4

Queueè un'interfaccia in Java, non è possibile farlo. provare:

Queue<Integer> Q = new LinkedList<Integer>();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.