ArrayDeque în Java

Implementarea recomandată pentru cozi și stive: un array circular care crește automat, rapid la ambele capete.

Sintaxă
new ArrayDeque<>()
new ArrayDeque<>(int capacitateInitiala)
new ArrayDeque<>(Collection<? extends E> c)

Ce face ArrayDeque

ArrayDeque ține elementele într-un array folosit circular: începutul și sfârșitul se mută fără să copieze elementele. De aceea adăugarea și scoaterea la ambele capete sunt foarte rapide, mai rapide decât la LinkedList și decât la vechea clasă Stack.

Implementează Deque, deci și Queue: o poți folosi ca stivă (push/pop) sau ca o coadă obișnuită (offer/poll). Nu are acces după index (get(i)) și nu acceptă null. Nu este sigură între fire de execuție.

Parametri

Parametru Descriere
capacitateInitiala Câte elemente încap înainte de prima mărire.
c Elementele inițiale, în ordinea colecției.

Ce returnează

O coadă cu două capete, modificabilă.

Exemple

Exemplul 1: Istoricul „Înapoi” dintr-un browser

import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) {
        ArrayDeque<String> inapoi = new ArrayDeque<>();
        String curent = "dexblog.ro";
        for (String pagina : new String[] {"dexblog.ro/invata", "dexblog.ro/invata/java", "dexblog.ro/invata/java/list"}) {
            inapoi.push(curent);
            curent = pagina;
        }
        System.out.println("Acum: " + curent);
        curent = inapoi.pop();
        System.out.println("Înapoi: " + curent);
        curent = inapoi.pop();
        System.out.println("Înapoi: " + curent);
        System.out.println("Rămase în istoric: " + inapoi);
    }
}

Rezultat

Acum: dexblog.ro/invata/java/list
Înapoi: dexblog.ro/invata/java
Înapoi: dexblog.ro/invata
Rămase în istoric: [dexblog.ro]

Exemplul 2: Ultimele 3 temperaturi (fereastră glisantă)

import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) {
        ArrayDeque<Integer> ultimele = new ArrayDeque<>();
        int[] masuratori = {18, 20, 23, 21, 19, 25};
        for (int t : masuratori) {
            ultimele.offerLast(t);
            if (ultimele.size() > 3) {
                ultimele.pollFirst();
            }
            double medie = ultimele.stream().mapToInt(Integer::intValue).average().orElse(0);
            System.out.printf("%s medie %.1f%n", ultimele, medie);
        }
    }
}

Rezultat

[18] medie 18.0
[18, 20] medie 19.0
[18, 20, 23] medie 20.3
[20, 23, 21] medie 21.3
[23, 21, 19] medie 21.0
[21, 19, 25] medie 21.7

Exemplul 3: null nu este permis

import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) {
        ArrayDeque<String> d = new ArrayDeque<>();
        try {
            d.offer(null);
        } catch (NullPointerException e) {
            System.out.println("ArrayDeque nu acceptă null");
        }
        System.out.println("poll pe gol: " + d.poll());
    }
}

Rezultat

ArrayDeque nu acceptă null
poll pe gol: null

Greșeli frecvente

  • Încerci deque.get(2). ArrayDeque nu are acces după index; dacă ai nevoie, folosește ArrayList.
  • Adaugi null. Apare NullPointerException.

Comenzi înrudite

  • 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ă.
  • Deque.push: Folosește un Deque ca stivă: push pune un element deasupra, pop îl scoate pe cel de deasupra, peek îl arată fără să-l scoată.
  • Queue: Interfața pentru cozi: elementele intră la coadă și ies din față, în ordinea sosirii (FIFO), ca la ghișeu.
  • LinkedList: Listă dublu înlănțuită: adăugare și ștergere rapide la ambele capete; implementează și List, și Deque.
  • ArrayList: Lista implementată cu un array intern care crește automat; acces foarte rapid după index. Cea mai folosită listă din Java.