Почему реализация связанного списка Java использует интерфейс deque? - PullRequest
3 голосов
/ 05 мая 2011

Я смотрел на реализацию Java LinkedList и обнаружил следующее:

public class LinkedList<E> 
       extends AbstractSequentialList<E> implements List<E>,
               Deque<E>, Cloneable, java.io.Serializable

Почему LinkedList должен поддерживать интерфейс Deque?Я понимаю желание добавить элементы в конец связанного списка, но эти методы должны были быть включены в интерфейс List.

Ответы [ 4 ]

5 голосов
/ 05 мая 2011

Реализация LinkedList удовлетворяет контракту Deque, так почему бы не заставить его реализовать интерфейс?

3 голосов
/ 05 мая 2011

IIRC, deque означает double end queue.В случае, если вы упомянули, не логично определять универсальный List как deque.Например, ArrayList не предназначен для интерфейса Deque.Вставки будут эффективны в конце списка, но абсолютно не в его начале (я думаю, что это приведет к перераспределению всего массива).

Значение LinkedList, с другой стороны,конец, идеально разработанный для интерфейса Deque, так как это двойной связанный список.

2 голосов
/ 05 мая 2011

Как говорится в JavaDocs:

Эти операции позволяют использовать связанные списки в качестве стека, очереди или двусторонней очереди.

Интерфейс списка - это просто список, то есть вы можете добавлять или удалять. Таким образом, базовая реализация интерфейса List должна просто предоставлять эти простые методы, например ArrayList. Интерфейс Deque - это двусторонняя очередь, а в iava LinkedList IS-A - двусторонняя очередь.

1 голос
/ 05 мая 2011

Поскольку двусторонняя очередь может быть реализована с использованием чего-либо, отличного от LinkedList, и чей-либо код может зависеть от чего-либо с такой функциональностью, поэтому интерфейс Deque должен быть доступен отдельно.

List сам по себе не должен реализовывать / расширять Deque, потому что добавление / удаление из начала списка может не быть чем-то, что может (легко) поддерживаться каждой реализацией.

...