Otra adición reciente a la estructura de colecciones es Deque. Se agregó en Java 6 y extiende Queue. Deque declara el comportamiento de una cola de doble extremo. Las colas de doble extremo funcionan como colas primero en entrar primero en salir, o como pilas último en entrar primero en salir. Deque es una interfaz genérica que tiene esta declaración:
interface Deque<E>
Aquí, E especifi ca el tipo de objetos que contendrá Deque.
Además de los métodos que hereda de Queue, Deque agrega estos métodos resumidos en la tabla 5-7. Varios métodos lanzan una ClassCastException cuando un objeto es incompatible con los elementos en la cola de doble extremo. Se lanza una NullPointerException si se hace un intento por almacenar un objeto null y no se permiten elementos null en la cola de doble extremo. Se lanza una IllegalArgumentException si se usa un argumento no válido. Se lanza una IllegalStateException si se hace un intento de agregar un elemento a una cola de doble extremo de longitud fi ja que está llena. Se lanza una NoSuchElementException si se hace un intento por eliminar un elemento de una cola de doble extremo vacía.
Tal vez las características más importantes de Deque son push( ) y pop( ). Estos métodos suelen usarse para habilitar el funcionamiento de Deque como una pila. Para poner un elemento en la parte superior de la pila, se llama a push( ). Para eliminar el elemento superior, se llama a pop( ). Además, observe el método descendingIterator( ). Devuelve un iterador que devuelve elementos en orden inverso. En otras palabras, devuelve un iterador que va del fi nal de la colección al principio.
Método Descripción
void addFirst(E obj) Agrega obj a la cabeza de la cola de doble extremo. Lanza una
IllegalStateException si una cola de doble extremo de capacidad
restringida se queda sin espacio.
void addLast(E obj) Agrega obj al fi nal de la cola de doble extremo. Lanza una
IllegalStateException si una cola de doble extremo de capacidad
restringida se queda sin espacio.
Iterator<E> descendingIterator( ) Devuelve un iterador que va del fi nal a la cabeza de la cola de doble extremo. En otras palabras, devuelve un iterador inverso.
E getFirst( ) Devuelve el primer elemento en la cola de doble extremo. El objeto no se elimina de la cola de doble extremo. Lanza una
NoSuchElementException si la cola de doble extremo está vacía.
E getLast( ) Devuelve el último elemento en la cola de doble extremo. El objeto no se elimina de la cola de doble extremo. Lanza una
NoSuchElementException si la cola de doble extremo está vacía.
boolean offerFirst(E obj) Trata de agregar obj a la cabeza de la cola de doble extremo. Devuelve
verdadero si se agregó obj y falso, de otra manera. Por tanto, este
método devuelve falso cuando se hace un intento por agregar obj a una cola de doble extremo llena, de capacidad restringida.
boolean offerLast(E obj) Trata de agregar obj al fi nal de la cola de doble extremo. Devuelve
verdadero si se agregó obj y falso, de otra manera.
Método Descripción
E peekFirst( ) Devuelve el elemento que se encuentra a la cabeza de la cola de doble extremo. Devuelve null si la cola de doble extremo está vacía. No se elimina el objeto.
E peekLast( ) Devuelve el elemento que se encuentra al fi nal de la cola de doble extremo. Devuelve null si la cola de doble extremo está vacía. No se elimina el objeto.
E pollFirst( ) Devuelve el elemento que se encuentra a la cabeza de la cola de doble extremo, eliminando el elemento en el proceso. Devuelve null si la cola de doble extremo vacía.
E pollLast( ) Devuelve el elemento que se encuentra al fi nal de la cola de doble extremo, eliminando el elemento en el proceso. Devuelve null si la cola de doble extremo está vacía.
E pop( ) Devuelve el elemento que se encuentra a la cabeza de la cola de doble extremo, eliminándolo en el proceso. Lanza
NoSuchElementException si la cola de doble extremo está vacía.
void push(E obj) Agrega obj a la cabeza de la cola de doble extremo. Lanza una
IllegalStateException si una cola de doble extremo de capacidad
restringida se queda sin espacio.
E removeFirst( ) Devuelve el elemento a la cabeza de la cola de doble extremo, eliminando el elemento en el proceso. Lanza
NoSuchElementException si la cola de doble extremo está vacía.
boolean
removeFirstOcurrence(Object obj)
Elimina la primera presentación de obj de la cola de doble extremo. Devuelve verdadero si tiene éxito y falso si la cola de doble extremo no contiene obj.
E removeLast( ) Devuelve el elemento que se encuentra al fi nal de la cola de doble extremo, eliminando el elemento en el proceso. Lanza
NoSuchElementException si la cola de doble extremo está vacía.
boolean
removeLastOcurrence(Object obj)
Elimina la última presentación de obj de la cola de doble extremo. Devuelve verdadero si tiene éxito y falso si la cola de doble extremo no contiene obj.
Tabla 5-7 Los métodos definidos por Deque (continuación)
Una implementación de Deque puede tener capacidad restringida, lo que signifi ca que sólo puede agregarse a la cola un número limitado de elementos. Cuando éste es el caso, puede fallar un intento de agregar un elemento a la cola de doble extremo. Deque le permite manejar esta falla de dos maneras. En primer lugar, métodos como push( ), addFirst( ) y addLast( ) lanzan una IllegalStateException si una cola de doble extremo de capacidad restringida está llena. En segundo lugar, otros métodos, como offerFirst( ) y offerLast( ), devuelven falso si el elemento no puede agregarse. Tiene la opción de seleccionar el método más adecuado para su aplicación.
Una situación similar ocurre en la eliminación de elementos de una cola de doble extremo. Métodos como pop( ) y removeFirst( ) lanzan una NoSuchElementException si se llaman en una colección vacía. Métodos como pollFirst( ) o pollLast( ) devuelven null si la colección está vacía. Una vez más, elija el método más compatible con su aplicación.