Dominando Java ArrayDeque: Guia Completo e Implementação de Stack
Java ArrayDeque
Este guia explica a classe ArrayDeque, seus métodos e exemplos práticos — incluindo como usá-la como pilha.
No Java, ArrayDeque implementa estruturas de dados queue e deque apoiadas por um array redimensionável.
Interfaces Implementadas pelo ArrayDeque
A classe ArrayDeque implementa as seguintes interfaces:
- Java Queue Interface
- Java Deque Interface
Criando um ArrayDeque
Primeiro importe o pacote:
import java.util.ArrayDeque;
Instancie um deque tipado:
ArrayDeque<Tipo> deque = new ArrayDeque<>();
Exemplos:
// Deque de strings
ArrayDeque<String> animais = new ArrayDeque<>();
// Deque de inteiros
ArrayDeque<Integer> idades = new ArrayDeque<>();
Principais Métodos do ArrayDeque
Inserindo Elementos
1. Usando add(), addFirst(), addLast()
add(E e)– anexaeà cauda.addFirst(E e)– insereena cabeça.addLast(E e)– equivalente aadd().
Nota: Se o deque estiver cheio, esses métodos lançam IllegalStateException.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.addFirst("Gato");
animais.addLast("Cavalo");
System.out.println("ArrayDeque: " + animais);
Saída
ArrayDeque: [Gato, Cachorro, Cavalo]
2. Usando offer(), offerFirst(), offerLast()
offer(E e)– anexaeà cauda, retornandotrueem sucesso.offerFirst(E e)– insereena cabeça.offerLast(E e)– mesmo queoffer().
Nota: Esses métodos retornam false se o deque estiver cheio.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.offer("Cachorro");
animais.offerFirst("Gato");
animais.offerLast("Cavalo");
System.out.println("ArrayDeque: " + animais);
Saída
ArrayDeque: [Gato, Cachorro, Cavalo]
Acessando Elementos
1. getFirst() e getLast()
getFirst()– retorna o elemento da cabeça.getLast()– retorna o elemento da cauda.
Nota: Lança NoSuchElementException se o deque estiver vazio.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.println("ArrayDeque: " + animais);
System.out.println("Primeiro Elemento: " + animais.getFirst());
System.out.println("Último Elemento: " + animais.getLast());
Saída
ArrayDeque: [Cachorro, Gato, Cavalo] Primeiro Elemento: Cachorro Último Elemento: Cavalo
2. peek(), peekFirst(), peekLast()
peek()– recupera mas não remove a cabeça.peekFirst()– sinônimo parapeek().peekLast()– recupera a cauda.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.println("ArrayDeque: " + animais);
System.out.println("Elemento da Cabeça: " + animais.peek());
System.out.println("Primeiro Elemento: " + animais.peekFirst());
System.out.println("Último Elemento: " + animais.peekLast());
Saída
ArrayDeque: [Cachorro, Gato, Cavalo] Elemento da Cabeça: Cachorro Primeiro Elemento: Cachorro Último Elemento: Cavalo
Nota: Se o deque estiver vazio, peek() e similares retornam null em vez de lançar exceção.
Removendo Elementos
1. remove(), removeFirst(), removeLast()
remove()– remove e retorna a cabeça.removeFirst()– mesmo queremove().removeLast()– remove e retorna a cauda.remove(Object o)– remove a primeira ocorrência deose presente.
Nota: Lança NoSuchElementException se o deque estiver vazio ou se remove(o) não encontrar o.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Vaca");
animais.add("Cavalo");
System.out.println("ArrayDeque: " + animais);
System.out.println("Elemento Removido: " + animais.remove());
System.out.println("Novo ArrayDeque: " + animais);
System.out.println("Primeiro Removido: " + animais.removeFirst());
System.out.println("Último Removido: " + animais.removeLast());
Saída
ArrayDeque: [Cachorro, Gato, Vaca, Cavalo] Elemento Removido: Cachorro Novo ArrayDeque: [Gato, Vaca, Cavalo] Primeiro Removido: Gato Último Removido: Cavalo
2. poll(), pollFirst(), pollLast()
poll()– remove e retorna a cabeça, ounullse vazio.pollFirst()– sinônimo parapoll().pollLast()– remove e retorna a cauda.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Vaca");
animais.add("Cavalo");
System.out.println("ArrayDeque: " + animais);
System.out.println("Elemento Removido: " + animais.poll());
System.out.println("Novo ArrayDeque: " + animais);
System.out.println("Primeiro Removido: " + animais.pollFirst());
System.out.println("Último Removido: " + animais.pollLast());
Saída
ArrayDeque: [Cachorro, Gato, Vaca, Cavalo] Elemento Removido: Cachorro Novo ArrayDeque: [Gato, Vaca, Cavalo] Primeiro Removido: Gato Último Removido: Cavalo
3. clear()
Esvazia o deque inteiro.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.println("ArrayDeque: " + animais);
animais.clear();
System.out.println("Novo ArrayDeque: " + animais);
Saída
ArrayDeque: [Cachorro, Gato, Cavalo] Novo ArrayDeque: []
Iterando sobre um ArrayDeque
iterator()– iterador para frente.descendingIterator()– iterador reverso.
ArrayDeque<String> animais = new ArrayDeque<>();
animais.add("Cachorro");
animais.add("Gato");
animais.add("Cavalo");
System.out.print("ArrayDeque: ");
Iterator<String> it = animais.iterator();
while(it.hasNext()) {
System.out.print(it.next() + ", ");
}
System.out.print("\nArrayDeque em ordem reversa: ");
Iterator<String> rev = animais.descendingIterator();
while(rev.hasNext()) {
System.out.print(rev.next() + ", ");
}
Saída
ArrayDeque: [Cachorro, Gato, Cavalo] ArrayDeque em ordem reversa: [Cavalo, Gato, Cachorro]
Outros Métodos Comuns
| Método | Descrição |
|---|---|
element() |
Recupera mas não remove a cabeça. |
contains(Object o) |
Verifica a presença de o; retorna true se encontrado. |
size() |
Número de elementos no deque. |
toArray() |
Converte o deque para um array. |
clone() |
Cria uma cópia rasa do deque. |
Usando ArrayDeque como Pilha (Stack)
Para comportamento LIFO, ArrayDeque é preferível sobre Stack devido a melhor desempenho e sem sobrecarga de sincronização legada.
Métodos estilo pilha:
push(E e)– adiciona à cabeça.peek()– recupera o elemento do topo sem remoção.pop()– remove e retorna o elemento do topo.
ArrayDeque<String> pilha = new ArrayDeque<>();
pilha.push("Cachorro");
pilha.push("Gato");
pilha.push("Cavalo");
System.out.println("Stack: " + pilha);
System.out.println("Elemento Acessado: " + pilha.peek());
System.out.println("Elemento Removido: " + pilha.pop());
Saída
Stack: [Cavalo, Gato, Cachorro] Elemento Acessado: Cavalo Elemento Removido: Cavalo
ArrayDeque vs LinkedList
Ambos implementam Deque, mas diferem:
LinkedListpermite elementosnull;ArrayDequenão permite.- Nós do LinkedList armazenam ponteiros, consumindo mais memória.
- Para cargas de trabalho queue/deque,
ArrayDequetipicamente superaLinkedList.
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código
- Entendendo o Java Vector: Uso, Recursos e Comparação com ArrayList