Какой класс лучше использовать для использования стека в java и почему он лучше?
Для стэка рекомендуется использовать реализации интерфейса 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
:
Мне кажется стоит использовать ArrayList
или LinkedList
. Второй будет использовать больше памяти, но зато операция добавления элемента в нём работает честные O(1)
, в отличии от ArrayList
, у которого O(1)
амортизированные. Не следует использовать класс Stack
, потому что в нём все методы помечены как synchronized
, что замедляет производительность в случае, если ваш стек использует только один поток (почти всегда именно так и происходит).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Написал , RMI клиент-сервер , на localhost все работает, проблема возникает при работе на виртуалке , сервер запускается и работает (на основной машине)...
Сделал свой адаптер для listview из примера, но возник такой вопрос список состоит из 6 элементов, на в каждом из элементов фиксированный набор...