4

我正在查看 LinkedList 的 java 实现,发现了这个:

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

为什么 LinkedList 应该支持 Deque 接口?我理解将元素添加到链表末尾的愿望,但这些方法应该包含在 List 接口中。

4

4 回答 4

6

LinkedList实现恰好满足契约,Deque为什么不让它实现接口呢?

于 2011-05-05T10:27:35.707 回答
4

正如 JavaDocs 所述:

这些操作允许将链表用作堆栈、队列或双端队列。

List 界面只是一个 List,即您可以添加或删除。因此,List 接口的基本实现必须只提供那些简单的方法,例如 ArrayList。Deque 接口是双端队列和 iava 的 LinkedList IS-A 双端队列。

于 2011-05-05T10:27:06.300 回答
3

IIRC,deque代表double end queue. 在您提到的情况下,将泛型定义为双端队列是不合逻辑List的。例如, anArrayList不是为Deque接口设计的。插入在列表的末尾将是有效的,但绝对不是在它的开头(因为它会导致整个数组的重新分配,我认为)。

LinkedList另一方面,它是为接口完美设计的,Deque因为它是一个双链表。

于 2011-05-05T10:30:40.093 回答
1

因为双端队列可能使用 a 以外的东西来实现,LinkedList并且一个人的代码可能依赖于具有这种功能的任何东西,所以Deque接口需要单独提供。

List本身不应该实现/扩展Deque,因为添加到列表的开头/从列表的开头删除可能不是每个实现都可以(轻松)支持的东西。

于 2011-05-05T10:27:47.543 回答