HOWTO · Java

Enqueue e Dequeue em Java

Noções básicas sobre Enqueue e Dequeue em Java e todas as outras informações relevantes

Nesta página

Em Java, enfileirar adiciona um elemento ao fim de uma fila FIFO, e desenfileirar remove o elemento do início. A interface Queue define essas operações; LinkedList é uma das classes que a implementam. Use offer e poll quando quiser que os valores de retorno indiquem se a inserção foi bem-sucedida ou se havia um elemento no início da fila.

Fila e FIFO

Uma fila processa elementos na ordem primeiro a entrar, primeiro a sair (FIFO): o primeiro valor adicionado é o primeiro a ser removido. A inserção ocorre no fim, enquanto a remoção e a consulta ocorrem no início. Essa ordem é útil quando um programa precisa processar tarefas, eventos ou mensagens na sequência em que foram recebidos.

Em Java, Queue é uma interface do framework de coleções. Ela define as operações comuns de fila sem exigir uma estratégia específica de armazenamento. As implementações podem ter limites de capacidade e características de desempenho diferentes; por isso, escolha uma que atenda à aplicação, sem presumir que todas as filas se comportam da mesma forma.

Para uma explicação relacionada sobre essa regra de ordenação, consulte o guia de filas FIFO em Java.

Enfileirar e desenfileirar

Enfileirar é a operação de adicionar um item ao fim da fila. Desenfileirar é a operação de remover o item do início. Esses nomes descrevem operações de fila; isso não significa que a interface Deque seja a mesma coisa que a operação de desenfileirar. Deque é uma interface Java distinta para coleções que permitem inserção e remoção nas duas extremidades.

Também é possível consultar o elemento no início da fila sem removê-lo. Isso é útil quando o código precisa decidir o que processar em seguida e manter a ordem dos elementos.

enqueue and dequeue java

Métodos de fila em Java

Para inserir, add(E) e offer(E) adicionam um elemento quando a fila pode aceitá-lo. O comportamento em relação à capacidade é diferente: add lança IllegalStateException se um limite de capacidade impedir a inserção, enquanto offer retorna false. Uma fila sem limite pode não impor uma capacidade fixa, então o resultado depende da implementação.

Para remover, remove() recupera e remove o elemento no início, mas lança NoSuchElementException se a fila estiver vazia. poll() também recupera e remove esse elemento, mas retorna null quando não há nenhum elemento para remover. Use poll() quando a fila vazia for uma situação esperada que o chamador deve tratar pelo valor de retorno.

element() e peek() consultam o elemento no início sem removê-lo. element() lança NoSuchElementException quando a fila está vazia; peek() retorna null. Esses métodos permitem escolher entre lançar uma exceção explicitamente e retornar um valor sentinela. Como poll() e peek() usam null para indicar que não há elemento disponível no início, evite armazenar null na fila se a lógica precisar distinguir esse resultado de um valor armazenado.

Implementar enfileiramento e desenfileiramento com LinkedList

O programa completo a seguir usa a interface Queue<String> com uma implementação LinkedList<String>. Ele adiciona dois valores, consulta o elemento no início e, em seguida, remove cada valor na ordem FIFO.

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("First");
        queue.offer("Second");
        System.out.println("Head: " + queue.peek());
        System.out.println("Removed: " + queue.poll());
        System.out.println("Removed: " + queue.poll());
    }
}
Head: First
Removed: First
Removed: Second

A execução registrada produziu a saída mostrada acima. A primeira consulta lê First sem removê-lo; depois, as duas chamadas a poll() removem First e, em seguida, Second. O tipo é declarado como Queue<String> para que o código dependa das operações de fila de que precisa, enquanto LinkedList fornece a implementação concreta. Outras implementações de Queue podem ser usadas quando sua capacidade e sua ordem de processamento forem adequadas à aplicação.

enqueue and dequeue - queue interface

A escolha principal depende da política que o chamador precisa para filas vazias e limites de capacidade: use offer, poll e peek quando os valores de retorno fizerem parte do fluxo normal do programa, ou use add, remove e element quando a condição excepcional correspondente deva ser sinalizada ao chamador.