Подтвердить что ты не робот

Почему Stack класс, а Queue - это интерфейс?

Я думаю, что они очень похожи... И когда нам нужно использовать стек или очередь, почему бы просто не использовать ArrayList или LinkedList для их замены?

4b9b3361

Ответ 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.

Кроме того, в отношении вашего второго вопроса вы, вероятно, должны использовать стек или очередь, если это то, что вы используете семантически. То есть, если вы делаете что-то вроде обхода графика, это помогает быть очень явным в отношении используемой структуры данных.