Класс Stack в Java

332
25 мая 2017, 08:49

Какой класс лучше использовать для использования стека в java и почему он лучше?

Answer 1

Для стэка рекомендуется использовать реализации интерфейса Deque. Интерфейс включает методы стэка: push, poll и peek.

Стандартные реализации перечислены в документации, например:

  • ArrayDeque — дэк на основе массива;
  • LinkedList — связный список;
  • ConcurrentLinkedDeque — потокобезопасная реализация.

Выбор класса зависит от логики приложения (какие операции выполняются и как часто, как изменяется размер стэка) и потребует оценки производительности.

В документации к ArrayDeque утверждается, что в качестве очереди он, скорее всего, будет быстрее LinkedList:

... This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.

так что, если не требуется доступ из нескольких потоков, разумно будет использовать ArrayDeque по умолчанию.

Также есть стандартный класс java.util.Stack, но его не рекомендуется использовать. Из документации:

A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example: Deque<Integer> stack = new ArrayDeque<Integer>();

Более полный и согласованный набор LIFO операций предоставляется через интерфейс Deque и его реализации, которые должны использоваться вместо этого класса. Например: Deque<Integer> stack = new ArrayDeque<Integer>();

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

  • Stack — конкретный класс, в отличие от остальных базовых коллекций, которые представлены интерфейсами: Set, List, Queue;
  • класс наследуется от Vector, что концептуально неверно (поддерживаются лишние операции).

Подробнее о проблемах Stack:

  • Why Stack extends Vector in JDK?
  • What are the negative aspects of Java class Stack inheriting from Vector?
Answer 2

Мне кажется стоит использовать ArrayList или LinkedList. Второй будет использовать больше памяти, но зато операция добавления элемента в нём работает честные O(1), в отличии от ArrayList, у которого O(1) амортизированные. Не следует использовать класс Stack, потому что в нём все методы помечены как synchronized, что замедляет производительность в случае, если ваш стек использует только один поток (почти всегда именно так и происходит).

READ ALSO
java Вылетает Exception java.rmi.ConnectIOException

java Вылетает Exception java.rmi.ConnectIOException

Написал , RMI клиент-сервер , на localhost все работает, проблема возникает при работе на виртуалке , сервер запускается и работает (на основной машине)...

215
Свой адаптер для listview

Свой адаптер для listview

Сделал свой адаптер для listview из примера, но возник такой вопрос список состоит из 6 элементов, на в каждом из элементов фиксированный набор...

305
Помощь в формирование базы данных

Помощь в формирование базы данных

ПриветДелаю проект онлайн банка для портфолио на Spring

240
Связь socket и servlet

Связь socket и servlet

Начал разбираться с сервлетами и задался вопросом:

275