Queue în Java

Interfața pentru cozi: elementele intră la coadă și ies din față, în ordinea sosirii (FIFO), ca la ghișeu.

Sintaxă
import java.util.Queue;
import java.util.ArrayDeque;

Queue<T> coada = new ArrayDeque<>();
Queue<T> coada = new LinkedList<>();
Queue<T> coada = new PriorityQueue<>();

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() sau element() pe o coadă care poate fi goală. Aruncă NoSuchElementException; poll() și peek() returnează null.
  • Pui null într-un ArrayDeque. Nu este permis, pentru că null este rezultatul special al lui poll.
  • Folosești ArrayList cu remove(0) ca o coadă. Fiecare ștergere mută toate elementele; ArrayDeque scoate 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.