我正在查看LinkedList的java实现,发现如下:
public class LinkedList<E>
extends AbstractSequentialList<E> implements List<E>,
Deque<E>, Cloneable, java.io.Serializable
为什么LinkedList要支持Deque接口?我理解将元素添加到链表末尾的愿望,但是这些方法应该包含在list接口中。
LinkedList
的实现恰好满足了Deque
的契约,那么为什么不让它实现接口呢?
如JavaDocs所述:
这些操作允许链表用作堆栈、队列或双端队列。
List接口只是一个List,也就是说你可以添加或删除。因此,List接口的基本实现必须只提供那些简单的方法,例如ArrayList。Deque接口是双端Queue和iava的LinkedList is - a双端Queue。
IIRC, deque
代表double end queue
。在您提到的情况下,将泛型List
定义为deque是不符合逻辑的。例如,ArrayList
不是为Deque
接口设计的。插入在列表的末尾是有效的,但绝对不是在列表的开头(因为它会导致整个数组的重新分配,我认为)。
另一方面,LinkedList
是为Deque
接口完美设计的,因为它是一个双链表。
由于双端队列可能使用LinkedList
以外的东西来实现,并且代码可能依赖于具有此类功能的任何东西,因此需要单独提供Deque
接口。
List
本身不应该实现/扩展Deque
,因为在列表的开头添加/删除可能不是每个实现都可以(容易地)支持的。