Interfaccia Queue in Java

Concetti Chiave
  • L'interfaccia Queue estende Collection e dichiara il comportamento di una coda, che spesso è una lista first-in, first-out.
  • Tuttavia, esistono tipi di code in cui l'ordinamento è basato su altri criteri.
  • I metodi principali includono element(), offer(), peek(), poll(), e remove().
  • L'interfaccia Deque estende Queue e dichiara il comportamento di una coda a doppia estremità.
  • I metodi aggiuntivi in Deque includono addFirst(), addLast(), getFirst(), getLast(), push(), e pop().

L'interfaccia Queue

L'interfaccia Queue estende Collection e dichiara il comportamento di una coda, che spesso è una lista first-in, first-out.

Tuttavia, esistono tipi di code in cui l'ordinamento è basato su altri criteri. Queue è un'interfaccia generica che ha questa dichiarazione:

interface Queue<E> extends Collection<E>

Qui, E specifica il tipo di oggetti che la coda conterrà. I metodi dichiarati da Queue sono mostrati nella Tabella seguente:

Metodo Descrizione
E element() Restituisce l'elemento alla testa della coda. L'elemento non viene rimosso. Lancia NoSuchElementException se la coda è vuota.
boolean offer(E obj) Tenta di aggiungere obj alla coda. Restituisce true se obj è stato aggiunto e false altrimenti.
E peek() Restituisce l'elemento alla testa della coda. Restituisce null se la coda è vuota. L'elemento non viene rimosso.
E poll() Restituisce l'elemento alla testa della coda, rimuovendo l'elemento nel processo. Restituisce null se la coda è vuota.
E remove() Rimuove l'elemento alla testa della coda, restituendo l'elemento nel processo. Lancia NoSuchElementException se la coda è vuota.
Tabella 1: Metodi dichiarati da Queue

Diversi metodi lanciano una ClassCastException quando un oggetto è incompatibile con gli elementi nella coda. Una NullPointerException viene lanciata se si tenta di memorizzare un oggetto null e gli elementi null non sono consentiti nella coda. Un'IllegalArgumentException viene lanciata se viene utilizzato un argomento non valido. Un'IllegalStateException viene lanciata se si tenta di aggiungere un elemento a una coda di lunghezza fissa che è piena. Una NoSuchElementException viene lanciata se si tenta di rimuovere un elemento da una coda vuota.

Nonostante la sua semplicità, Queue offre diversi punti di interesse. Primo, gli elementi possono essere rimossi solo dalla testa della coda. Secondo, ci sono due metodi che ottengono e rimuovono elementi: poll() e remove(). La differenza tra loro è che poll() restituisce null se la coda è vuota, ma remove() lancia un'eccezione. Terzo, ci sono due metodi, element() e peek(), che ottengono ma non rimuovono l'elemento alla testa della coda. Differiscono solo nel fatto che element() lancia un'eccezione se la coda è vuota, ma peek() restituisce null. Infine, si noti che offer() tenta solo di aggiungere un elemento a una coda. Poiché alcune code hanno una lunghezza fissa e potrebbero essere piene, offer() può fallire.

L'Interfaccia Deque

L'interfaccia Deque estende Queue e dichiara il comportamento di una coda a doppia estremità. In altre parole, gli elementi possono essere aggiunti o rimossi da entrambe le estremità della coda. Analogamente, gli elementi possono essere ottenuti da entrambe le estremità della coda.

Le code a doppia estremità possono funzionare come code standard first-in, first-out o come uno stack, ossia last-in, first-out. Deque è un'interfaccia generica che ha questa dichiarazione:

interface Deque<E> extends Queue<E>

Qui, E specifica il tipo di oggetti che la deque conterrà. Oltre ai metodi che eredita da Queue, Deque aggiunge quei metodi riassunti nella Tabella seguente:

Metodo Descrizione
void addFirst(E obj) Aggiunge obj alla testa della deque. Lancia un IllegalStateException se una deque con capacità limitata è rimasta senza spazio.
void addLast(E obj) Aggiunge obj alla coda della deque. Lancia un IllegalStateException se una deque con capacità limitata è rimasta senza spazio.
Iterator<E> descendingIterator() Restituisce un iteratore che si muove dalla coda alla testa della deque. In altre parole, restituisce un iteratore inverso.
E getFirst() Restituisce il primo elemento nella deque. L'oggetto non viene rimosso dalla deque. Lancia NoSuchElementException se la deque è vuota.
E getLast() Restituisce l'ultimo elemento nella deque. L'oggetto non viene rimosso dalla deque. Lancia NoSuchElementException se la deque è vuota.
boolean offerFirst(E obj) Tenta di aggiungere obj alla testa della deque. Restituisce true se obj è stato aggiunto e false altrimenti. Pertanto, questo metodo restituisce false quando si tenta di aggiungere obj a una deque piena con capacità limitata.
boolean offerLast(E obj) Tenta di aggiungere obj alla coda della deque. Restituisce true se obj è stato aggiunto e false altrimenti.
E peekFirst() Restituisce l'elemento alla testa della deque. Restituisce null se la deque è vuota. L'oggetto non viene rimosso.
E peekLast() Restituisce l'elemento alla coda della deque. Restituisce null se la deque è vuota. L'oggetto non viene rimosso.
E pollFirst() Restituisce l'elemento alla testa della deque, rimuovendo l'elemento nel processo. Restituisce null se la deque è vuota.
E pollLast() Restituisce l'elemento alla coda della deque, rimuovendo l'elemento nel processo. Restituisce null se la deque è vuota.
E pop() Restituisce l'elemento alla testa della deque, rimuovendolo nel processo. Lancia NoSuchElementException se la deque è vuota.
void push(E obj) Aggiunge obj alla testa della deque. Lancia un IllegalStateException se una deque con capacità limitata è senza spazio.
E removeFirst() Restituisce l'elemento alla testa della deque, rimuovendo l'elemento nel processo. Lancia NoSuchElementException se la deque è vuota.
boolean removeFirstOccurrence(Object obj) Rimuove la prima occorrenza di obj dalla deque. Restituisce true se ha successo e false se la deque non conteneva obj.
E removeLast() Restituisce l'elemento alla coda della deque, rimuovendo l'elemento nel processo. Lancia NoSuchElementException se la deque è vuota.
boolean removeLastOccurrence(Object obj) Rimuove l'ultima occorrenza di obj dalla deque. Restituisce true se ha successo e false se la deque non conteneva obj.
Tabella 2: Metodi Dichiarati da Deque

Diversi metodi lanciano una ClassCastException quando un oggetto è incompatibile con gli elementi nella deque. Una NullPointerException viene lanciata se si tenta di memorizzare un oggetto null e gli elementi null non sono consentiti nella deque. Una IllegalArgumentException viene lanciata se viene usato un argomento non valido. Una IllegalStateException viene lanciata se si tenta di aggiungere un elemento a una deque a lunghezza fissa che è piena. Una NoSuchElementException viene lanciata se si tenta di rimuovere un elemento da una deque vuota.

Notiamo che Deque include i metodi push() e pop(). Questi metodi abilitano una Deque a funzionare come uno stack. Inoltre, notiamo il metodo descendingIterator(). Restituisce un iteratore che restituisce elementi in ordine inverso. In altre parole, restituisce un iteratore che si muove dalla fine della collezione all'inizio. Un'implementazione Deque può essere con capacità limitata, il che significa che solo un numero limitato di elementi può essere aggiunto alla deque. Quando questo è il caso, un tentativo di aggiungere un elemento alla deque può fallire. Deque consente di gestire tale fallimento in due modi. Primo, metodi come addFirst() e addLast() lanciano una IllegalStateException se una deque con capacità limitata è piena. Secondo, metodi come offerFirst() e offerLast() restituiscono false se l'elemento non può essere aggiunto.