Почему я должен использовать 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).