Я думаю, что они очень похожи... И когда нам нужно использовать стек или очередь, почему бы просто не использовать ArrayList или LinkedList для их замены?
Почему Stack класс, а Queue - это интерфейс?
Ответ 1
Stack
, представляет собой стек Last-In-First-Out объектов, полученных из Vector
, а также класс. Vector
идет со "старым" набором коллекций, изначально поставляемым Java, и в конечном итоге получается из AbstractCollection
. Следует отметить, что действительно существует одна каноническая реализация Stack
; Queue
и List
имеют много хорошо известных реализаций, которые могут сделать существенную разницу в производительности при правильном выборе.
Queue
, с другой стороны, следует интерфейсу Collection
из "нового" набора коллекций, который обычно используется сегодня, поэтому он следует интерфейсам и поставляется с различными реализациями.
Stack
следует использовать, когда вам нужна семантика LIFO, тогда как Queue
следует использовать, когда вам нужна семантика First-In-First-Out.
ArrayList
и LinkedList
хранят упорядоченные коллекции вещей и не выстраиваются непосредственно в случаях использования Stack
или Queue
. Stack
и Queue
являются в некотором смысле буферами данных, тогда как семантика a List
обычно делает ее такой, что она является хранилищем данных; ничто не мешает вам использовать List
для реализации Stack
или Queue
.
Ответ 2
Ну, одна из причин заключается в том, что есть варианты очередей, которые удобно менять, например PriorityQueues. Они выполняют один и тот же интерфейс, но ведут себя по-разному. Я не думаю, что для Stacks есть что-то подобное, или, по крайней мере, оно не используется почти так же часто.
Вы не сможете моделировать очередность приоритетов, используя только ArrayList.
Кроме того, в отношении вашего второго вопроса вы, вероятно, должны использовать стек или очередь, если это то, что вы используете семантически. То есть, если вы делаете что-то вроде обхода графика, это помогает быть очень явным в отношении используемой структуры данных.