2009-04-29 17 views

risposta

7

La documentazione per Queue elenca varie implementazioni, tra cui

scegliere un applicazione che si adatta alle vostre esigenze.

+0

Secondo http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html, ArrayList non significa implementare coda. –

+0

Sì, me ne sono reso conto quando sono tornato per prendere alcuni link; ovviamente la mia memoria è difettosa. – Rob

+2

Succede. Sarei rimasto colpito se avessi memorizzato l'intera libreria Java. Se avessi memorizzato EE, mi sarei allontanato lentamente. –

31

Il Javadocs fornisce un elenco di classi che implementano Queue.

tutte le classi di attuazione note:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedBlockingDeque, LinkedList, PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Ci sono anche alcuni subinterfaces che potresti trovare utile:

Tutti Interfacce secondarie noti:

BlockingDeque < E>, BlockingQueue < E>, Deque < E>

+9

Mi chiedo perché le persone non vanno a JavaDocs: P +1 – Perpetualcoder

+4

non è Stack Overflow più veloce di Google? – IAdapter

+5

Per le persone veramente pigre, noterò che tutti quelli con DeQue sono code a doppio attacco. – Powerlord

10

coda ha più implementazioni: dal API:

Tutto Classi di implementazione conosciute:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue 

Si noti che AbstractQueue non è una classe concreta.

Alcuni di questi sono dal pacchetto simultaneo, quindi se si sta implementando un jobqueue o qualcosa di simile, si dovrebbe andare su ConcurrentLinkedQueue o PriorityBlockingQueue (per un heap) per ex.

3

Oltre a utilizzare i documenti API per trovare "tutte le classi di implementazione conosciute", spesso esistono altre implementazioni non pubbliche che sono comunque disponibili tramite l'API pubblica (solo senza richiedere risme di documentazione inutile). Se clicchi su "use" troverai anche Collections.asLifoQueue (Deque è già un Queue, ma è FIFO piuttosto che uno stack).

+0

Ogni tanto riscopro le pagine "Usa" e penso, "Ehi, è grandioso!" E poi li ho dimenticati di nuovo. –

+0

Le pagine "use" non hanno la più grande delle UI. –

2

Sebbene le risposte suonino un po 'sdegnose, in realtà sono piuttosto interessanti insegnandoti a pescare.Una coda è semplicemente un modo di guardare una collezione, quindi molte raccolte possono implementarla. Inoltre, le cose che agiscono come raccolte ma con una logica specifica (come le code di thread) potrebbero utilizzare la stessa interfaccia.

Sapere dove guardare i javadoc è di grande aiuto. Sono sicuro che hai guardato ma semplicemente non hai pensato di guardare alle implementazioni. Vivere e imparare.

A volte potrebbe anche essere necessario inseguire sottoclasse/estendere elenchi. Ad esempio, se hai guardato in coda e hai visto AbstractQueue, potresti voler vedere quali classi lo implementano.

sarò sbarazzarsi di uno dei tuoi -1S per ya :)

0
import java.util.Queue; 

solo che

Enqueue function == Queue_Object.add(input_value); 

Dequeue function == Queue_Object.pull(); //return the value and delete it from queue 
2

No, non c'è nessuna classe Queue, perché ci sono un sacco di modi diversi per implementare una coda e devi scegliere quella che si adatta al tuo caso d'uso. Lo stesso vale per qualsiasi altra raccolta nel framework delle raccolte: ad esempio, ArrayList e LinkedList implementano entrambi uno List. Lo schema generale, che è un buon uso dell'ereditarietà degli oggetti, è:

L'interfaccia , ad es. Queue, definisce il ruolo in cui si desidera riprodurre un oggetto;

Sottointerfacce, ad es. Deque, espande ulteriormente o specializza il ruolo: in questo caso una coda "deque" o doppia coda consente di aggiungere e rimuovere elementi da entrambe le estremità della coda, invece di aggiungere solo alla parte posteriore e rimuovere dal fronte;

Le classi forniscono l'implementazione di come un oggetto svolge il ruolo. Ad esempio, un ArrayDeque utilizza un array ridimensionabile per implementare una coda a doppio attacco, che presenta diversi punti di forza e punti deboli a LinkedList che utilizza un elenco collegato.

di approfondire l'idea di un'interfaccia come un ruolo, si noti che anche se ArrayDeque implementa Deque, è possibile utilizzarlo come un Queue senza doversi preoccupare di questo, perché l'attuazione entrambe le interfacce significa che può giocare entrambi i ruoli. Allo stesso modo, LinkedList può indossare un cappello List, Queue o Deque.

Per questo motivo, il modo normale (consigliato) di utilizzare qualcosa come il framework Collections è il programma nell'interfaccia, ovvero utilizzare un'interfaccia quando si utilizza la classe anziché il nome della classe stessa. Ad esempio, si istanzia un oggetto come questo:

Queue<String> logQueue = new ConcurrentLinkedQueue<String>(); 
... 
logQueue.add("Log message"); 

In questo modo si è

  • non legato ad una particolare classe e può utilizzare un rimpiazzo se necessario, senza dover modificare molto codice e
  • documentano ciò che si sta facendo con un corso nominando il ruolo che esso svolge. Il principio generale a cui è utile è codice auto-documentante, che è essenzialmente quello di lasciare che il codice stesso sia autoesplicativo senza dover utilizzare commenti, ecc.
1
Queue<Integer> queue = new LinkedList<>(); 

queue.add(1); 
queue.add(2); 
queue.add(3); 

while (!queue.isEmpty()) { 
    System.out.println(queue.remove());// prints 1 2 3 
}