Por que devo usar o Deque over Stack?

Preciso de uma estrutura de dados do Stack para meu caso de uso. Eu deveria ser capaz de empurrar itens para a estrutura de dados e só quero recuperar o último item da pilha. O JavaDoc for Stack diz:

Um conjunto mais completo e consistente de operações de pilha LIFO é fornecido pela interface Deque e suas implementações, que devem ser usadas em preferência a essa class. Por exemplo:

 Deque stack = new ArrayDeque(); 

Eu definitivamente não quero o comportamento sincronizado aqui, pois usarei esta estrutura de dados local para um método. Além disso, por que devo preferir Deque over Stack aqui?

PS: O javadoc do Deque diz:

Deques também podem ser usados ​​como pilhas LIFO (Last-In-First-Out). Essa interface deve ser usada de preferência para a class Stack herdada.

Por um lado, é mais sensato em termos de inheritance. O fato de que Stack estende o Vector é realmente estranho, na minha opinião. No início de Java, a inheritance foi usada em excesso IMO – Properties sendo outro exemplo.

Para mim, a palavra crucial nos documentos que você citou é consistente . Deque expõe um conjunto de operações que é tudo sobre ser capaz de buscar / adicionar / remover itens a partir do início ou no final de uma coleção, iterar etc – e é isso. Não há como acessar um elemento por posição, o que Stack expõe porque é uma subclass de Vector .

Ah, e também o Stack não tem interface, então se você sabe que precisa das operações do Stack você acaba se comprometendo com uma class concreta específica, o que geralmente não é uma boa idéia.

Aqui está a minha interpretação da inconsistência mencionada na descrição da class Stack.

Se você observar as implementações de propósito geral aqui, verá que há uma abordagem consistente para a implementação do conjunto, mapa e lista.

  • Para definir e mapear, temos duas implementações padrão com mapas e trees hash. O primeiro é mais usado e o segundo é usado quando precisamos de uma estrutura ordenada (e também implementa sua própria interface – SortedSet ou SortedMap).

  • Podemos usar o estilo preferido de declarar como Set set = new HashSet(); veja as razões aqui .

Mas a class Stack: 1) não tem sua própria interface; 2) é uma subclass da class Vector – que é baseada em array redimensionável; Então, onde é a implementação de linked list de pilha?

Na interface Deque, não temos problemas como include duas implementações (array redimensionável – ArrayDeque; linked list – LinkedList).

Deque é usado na situação em que você deseja recuperar elementos da cabeça e da cauda. Se você quiser uma pilha simples, não há necessidade de ir para um deque.