Почему я должен использовать Deque над стеком?


мне нужно Stack структура данных для моего варианта использования. Я должен иметь возможность вставлять элементы в структуру данных, и я хочу только получить последний элемент из стека . Элемент JavaDoc для стека говорит :

более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые должны использоваться в предпочтении к этому классу. Например:

Deque<Integer> stack = new ArrayDeque<>();

Я точно не хочу синхронизированное поведение здесь, поскольку я буду использовать эту структуру данных локально для метода . Кроме того, почему я должен предпочесть Deque over Stack здесь ?

P. S: javadoc от Deque говорит:

двусторонней очередью также может быть использован в качестве ЛИФО (последним пришел-первым вышел) стеки. Этот интерфейс должен использоваться в предпочтении к устаревшему классу стека.

3 105

3 ответа:

во-первых, это более разумно с точки зрения наследования. Дело в том, что Stack выходит Vector - это очень странно, на мой взгляд. В начале Java наследование было чрезмерно использовано IMO -Properties еще один пример.

для меня решающее слово в документах, которые вы цитировали, - это последовательный. Deque предоставляет набор операций, который это все о возможности для извлечения/добавления/удаления элементов в начало или конец коллекции, перебирать и т. д. - И это все. Там нарочно никакого способа получить доступ к элементу по позиции, которая Stack предоставляет , потому что это подкласс Vector.

О, и еще Stack не имеет интерфейса, так что если вы знаете, что нужно Stack операции, которые вы в конечном итоге совершаете в определенном конкретном классе, что обычно не является хорошей идеей.

вот моя интерпретация несоответствия указанных в описании класса Stack.

Если вы посмотрите на реализации общего назначения здесь - вы увидите, что существует последовательный подход к реализации набора, карты и списка.

  • для набора и карты у нас есть 2 стандартные реализации с хэш-картами и деревьями. Первый наиболее часто используется, а второй используется, когда нам нужна упорядоченная структура (и она также реализует свою собственную интерфейс-SortedSet или SortedMap).

  • мы можем использовать предпочтительный стиль объявления как Set<String> set = new HashSet<String>();вижу причины здесь.

но класс стека: 1) не имеет собственного интерфейса; 2) является подклассом векторного класса - который основан на изменяемом массиве; так где же реализация связанного списка стека?

в интерфейсе Deque у нас нет таких проблем, включая две реализации (resizable array-ArrayDeque; linked list-LinkedList).

Deque используется ситуация, когда вы хотите получить элементы из головы и хвоста. Если вы хотите простой стек нет необходимости идти на деке.