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.
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.
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.