2011-05-05 55 views
1

我一直在寻找在java实现的LinkedList,并发现这一点:为什么java链表实现使用interface deque?

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

为什么要在LinkedList支持双端队列接口? 我明白希望将元素添加到链表的末尾,但这些方法应该包含在List接口中。

+1

只是因为你可以实现一个链表的队列? – 2011-05-05 10:25:25

+1

并非所有的列表都是Deques,并非所有的Deques都是列表。 – 2011-05-05 10:33:06

+0

我现在明白,仅仅因为其中一个实现恰好是一个链表,而链表可以轻松适应deque操作,所以无法更改列表接口。我可能会定义一个扩展列表接口和deque接口的链表列表接口。然后定义一个linkedlistImpl类。所以,我想“LinkedList实现恰好满足Deque契约,那么为什么不让它实现接口呢?” Qwerky的回应是适当的。谢谢。 – 2011-05-05 12:57:58

回答

5

LinkedList实施恰好满足Deque合同,所以为什么不使它实现接口?

1

作为JavaDoc中指出:

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

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

1

由于双端队列可能使用非LinkedList以外的东西来实现,并且其代码可能取决于具有此类功能的任何内容,因此需要单独提供接口。

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

3

IIRC,deque代表double end queue。在你提到的情况下,将一个通用的List定义为双端队列是不合逻辑的。例如,ArrayList不适用于Deque接口。插入效果在列表的最后,但绝对不是在开始(因为它会导致重新分配整个数组,我认为)。

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