HOWTO · Java

Enqueue y Dequeue en Java

Comprensión de Enqueue y Dequeue en Java y cualquier otra información relevante

En esta página

En Java, encolar añade un elemento al final de una cola FIFO y desencolar elimina el elemento que está al principio. La interfaz Queue define estas operaciones; LinkedList es una de las clases que la implementan. Usa offer y poll cuando necesites que sus valores de retorno indiquen si la inserción se realizó o si había un elemento al principio de la cola.

Cola y FIFO

Una cola procesa los elementos en orden primero en entrar, primero en salir (FIFO): el primer valor que se añade es el primero que se elimina. Los elementos se añaden al final, mientras que se eliminan y consultan desde el principio. Este orden es útil cuando un programa debe procesar tareas, eventos o mensajes en el orden en que se reciben.

En Java, Queue es una interfaz del marco de colecciones. Define las operaciones habituales de una cola sin exigir una estrategia de almacenamiento concreta. Las implementaciones pueden tener distintos límites de capacidad y características de rendimiento; por eso, elige una que se adapte a la aplicación en lugar de suponer que todas las colas se comportan igual.

Para consultar una explicación relacionada sobre esta regla de orden, visita la guía de colas FIFO en Java.

Encolar y desencolar

Encolar consiste en añadir un elemento al final. Desencolar consiste en eliminar el elemento que está al principio. Estos términos describen operaciones de una cola; no significan que la interfaz Deque sea lo mismo que la operación de desencolar. Deque es una interfaz independiente de Java para colecciones que permiten insertar y eliminar elementos en ambos extremos.

También puedes consultar el elemento situado al principio de una cola sin eliminarlo. Esto resulta útil cuando el código necesita decidir qué procesar a continuación y, al mismo tiempo, mantener intacto el orden de la cola.

enqueue and dequeue java

Métodos de Queue en Java

Para insertar elementos, add(E) y offer(E) los añaden cuando la cola los acepta. Su comportamiento ante los límites de capacidad es distinto: add lanza IllegalStateException si una restricción de capacidad impide la inserción, mientras que offer devuelve false. Una cola sin límite puede no tener una capacidad fija, por lo que el resultado depende de la implementación.

Para eliminar elementos, remove() obtiene y elimina el primero de la cola, pero lanza NoSuchElementException si está vacía. poll() también obtiene y elimina el primero, pero devuelve null si no hay ningún elemento. Usa poll() cuando sea normal que la cola esté vacía y el código que la llama deba gestionar ese estado mediante el valor de retorno.

element() y peek() consultan el elemento situado al principio sin eliminarlo. Si la cola está vacía, element() lanza NoSuchElementException y peek() devuelve null. Estos métodos te permiten elegir entre una excepción explícita y un valor de retorno que indica que no hay elemento. Como poll() y peek() usan null para indicar que no hay ningún elemento disponible al principio, evita guardar null en la cola si tu lógica necesita distinguir ese resultado de un valor almacenado.

Implementar encolado y desencolado con LinkedList

El siguiente programa completo usa la interfaz Queue<String> con una implementación LinkedList<String>. Añade dos valores, consulta el primero y luego elimina cada valor en orden 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

La ejecución registrada produjo la salida mostrada arriba. La primera consulta lee First sin eliminarlo; después, las dos llamadas a poll() eliminan First y, a continuación, Second. El tipo se declara como Queue<String> para que el código dependa de las operaciones de cola que necesita, mientras que LinkedList proporciona la implementación concreta. Se pueden sustituir otras implementaciones de Queue cuando su capacidad y su orden se adapten a la aplicación.

enqueue and dequeue - queue interface

La decisión clave depende de cómo deba gestionar el código que llama a la cola su capacidad y el caso de que esté vacía: usa offer, poll y peek cuando sus valores de retorno formen parte del flujo normal del programa, o usa add, remove y element cuando quieras que la condición excepcional correspondiente se comunique mediante una excepción.