java.util.Stack — класс Java 1.0, наследник Vector. Каждая операция синхронизирована (бесполезная цена для локального стека), и от Vector унаследованы get(i), add(i, x), remove(i) — можно залезть в середину стека. Документация сама рекомендует Deque.
ArrayDeque — кольцевой буфер на массиве с указателями головы и хвоста. Добавление и снятие с обоих концов — амортизированно O(1), элементы лежат подряд (хорошо для кэша), нет объекта-узла на элемент. Растёт удвоением.
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); stack.push(2); stack.pop(); // 2
Deque<Task> queue = new ArrayDeque<>();
queue.offer(t1); queue.offer(t2); queue.poll(); // t1
LinkedList как очередь — медленнее ArrayDeque: узел на каждый элемент, промахи кэша, нагрузка на GC.
Многопоточно — ConcurrentLinkedDeque (без блокировок), LinkedBlockingDeque и ArrayBlockingQueue (с ожиданием).