Ce face Queue
O Queue (coadă) lucrează după regula FIFO (first in, first out, „primul venit, primul servit”): adaugi la sfârșit cu offer, scoți din față cu poll și te uiți la primul fără să-l scoți cu peek.
Fiecare operație are două forme: una care aruncă excepție când nu se poate (add, remove, element) și una care returnează o valoare specială (offer → false, poll/peek → null). În practică se folosesc mai des offer, poll, peek.
Implementarea obișnuită este ArrayDeque. LinkedList merge și ea, iar PriorityQueue este o coadă specială în care iese mereu cel mai mic element, nu cel venit primul.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul elementelor. |
Ce returnează
Un obiect care implementează Queue.
Exemple
Exemplul 1: Clienți la ghișeu
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<String> ghiseu = new ArrayDeque<>();
ghiseu.offer("Ana");
ghiseu.offer("Radu");
ghiseu.offer("Elena");
System.out.println("La rând: " + ghiseu);
while (!ghiseu.isEmpty()) {
System.out.println("Servit: " + ghiseu.poll());
}
}
}
Rezultat
La rând: [Ana, Radu, Elena]
Servit: Ana
Servit: Radu
Servit: Elena
Exemplul 2: Parcurgere în lățime (BFS) printre orașe
Coada ține orașele de vizitat. Fiecare oraș scos își adaugă vecinii nevizitați la coadă, deci orașele apar în ordinea distanței față de Iași.
import java.util.ArrayDeque;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map<String, List<String>> drumuri = Map.of(
"Iași", List.of("Vaslui", "Suceava"),
"Vaslui", List.of("Bacău"),
"Suceava", List.of("Bacău", "Cluj"),
"Bacău", List.of("Brașov"),
"Cluj", List.of(),
"Brașov", List.of());
Queue<String> coada = new ArrayDeque<>(List.of("Iași"));
Set<String> vazute = new LinkedHashSet<>(List.of("Iași"));
while (!coada.isEmpty()) {
for (String vecin : drumuri.get(coada.poll())) {
if (vazute.add(vecin)) {
coada.offer(vecin);
}
}
}
System.out.println(vazute);
}
}
Rezultat
[Iași, Vaslui, Suceava, Bacău, Cluj, Brașov]
Greșeli frecvente
- Folosești
remove()sauelement()pe o coadă care poate fi goală. AruncăNoSuchElementException;poll()șipeek()returneazănull. - Pui
nullîntr-unArrayDeque. Nu este permis, pentru cănulleste rezultatul special al luipoll. - Folosești
ArrayListcuremove(0)ca o coadă. Fiecare ștergere mută toate elementele;ArrayDequescoate din față imediat.
Comenzi înrudite
Queue.offer: offer pune un element la coada cozii, poll îl scoate pe primul (sau dă null), peek îl arată pe primul fără să-l scoată.Deque: Coadă cu două capete: adaugi și scoți atât la început, cât și la sfârșit. Se folosește și ca stivă, și ca coadă.ArrayDeque: Implementarea recomandată pentru cozi și stive: un array circular care crește automat, rapid la ambele capete.PriorityQueue: Coadă cu priorități: poll() scoate mereu cel mai mic element (sau primul după un Comparator), nu pe cel adăugat primul.LinkedList: Listă dublu înlănțuită: adăugare și ștergere rapide la ambele capete; implementează și List, și Deque.