Почему я должен использовать Deque над стеком?
мне нужно Stack
структура данных для моего варианта использования. Я должен иметь возможность вставлять элементы в структуру данных, и я хочу только получить последний элемент из стека . Элемент JavaDoc для стека говорит :
более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые должны использоваться в предпочтении к этому классу. Например:
Deque<Integer> stack = new ArrayDeque<>();
Я точно не хочу синхронизированное поведение здесь, поскольку я буду использовать эту структуру данных локально для метода . Кроме того, почему я должен предпочесть Deque
over Stack
здесь ?
P. S: javadoc от Deque говорит:
двусторонней очередью также может быть использован в качестве ЛИФО (последним пришел-первым вышел) стеки. Этот интерфейс должен использоваться в предпочтении к устаревшему классу стека.
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).