¿Por qué debería usar Deque sobre Stack?

Necesito una estructura de datos de Stack para mi caso de uso. Debería poder insertar elementos en la estructura de datos y solo quiero recuperar el último elemento de la stack. El JavaDoc para Stack dice:

Un conjunto más completo y consistente de operaciones de stack LIFO es proporcionado por la interfaz Deque y sus implementaciones, que se deben usar con preferencia a esta clase. Por ejemplo:

 Deque stack = new ArrayDeque(); 

Definitivamente no quiero un comportamiento sincronizado aquí, ya que usaré esta estructura de datos local para un método. Aparte de esto, ¿por qué debería preferir Deque a Stack aquí?

PD: El javadoc de Deque dice:

Deques también se puede usar como stacks LIFO (Last-In-First-Out). Esta interfaz debe usarse con preferencia a la clase Stack heredada.

Por un lado, es más sensato en términos de herencia. El hecho de que Stack extienda Vector es realmente extraño, desde mi punto de vista. Temprano en Java, la herencia fue usada en exceso IMO – Las Properties son otro ejemplo.

Para mí, la palabra crucial en los documentos que citó es consistente . Deque expone un conjunto de operaciones que se trata de ser capaz de buscar / agregar / eliminar elementos desde el inicio o el final de una colección, iterar, etc., y eso es todo. No hay forma deliberada de acceder a un elemento por posición, lo que Stack expone porque es una subclase de Vector .

Ah, y también Stack no tiene interfaz, por lo que si sabes que necesitas las operaciones de Stack , terminas comprometiéndote con una clase concreta específica, lo cual no suele ser una buena idea.

Aquí está mi interpretación de inconsistencia mencionada en la descripción de la clase Stack.

Si observa implementaciones de propósito general aquí , verá que hay un enfoque consistente para la implementación del conjunto, el mapa y la lista.

  • Para el conjunto y el mapa tenemos 2 implementaciones estándar con mapas de hash y árboles. El primero es el más utilizado y el segundo se usa cuando necesitamos una estructura ordenada (y también implementa su propia interfaz – SortedSet u SortedMap).

  • Podemos usar el estilo preferido de declarar como Set set = new HashSet(); ver razones aquí .

Pero la clase Stack: 1) no tiene su propia interfaz; 2) es una subclase de la clase Vector, que se basa en una matriz de tamaño variable; Entonces, ¿dónde está la implementación de la lista vinculada de la stack?

En la interfaz de Deque no tenemos tales problemas, incluidas dos implementaciones (matriz redimensionable – ArrayDeque, lista enlazada – ListaEnlazada).

Se usa Deque es una situación en la que desea recuperar elementos de la cabeza y la cola. Si quieres una stack simple, no hay necesidad de ir por una apuesta.