用于队列和堆栈的Java LinkedList方法

时间:2011-10-05 04:41:24

标签: java data-structures stack queue linked-list

如果查看Java的LinkedList方法,它确实为Queue,Stack,Deque提供了操作。

我知道您可以使用LinkedList实现Queue,Stack或Deque。如果你看一下C#实现,Queue和Stack使用数组。

我的好奇心是,为什么他们为链表提供推送(T e)方法?

为什么Queue和Stack不是单独的类,就像C#一样。

下面是push和pop的代码,它是duhhh。但为什么呢?

public void push(Object obj)
{
    addFirst(obj);
}

public Object pop()
{
    return removeFirst();
}

如果查看HashMap或HashSet,它会在内部使用数组,并且相应地有LinkedHashSet和map来保持排序。

这并不是真的令人困惑,但它确实没有意义。

为什么java有这样的实现?

5 个答案:

答案 0 :(得分:3)

专注于数据结构实施:

链接列表对于频繁添加和删除非常有效。 (正如Queue和Stack通常那样,迭代操作很少见)。数组不是,它需要耗时的数组复制操作

答案 1 :(得分:3)

诸如Java的LinkedList之类的双链表是一种相当灵活的数据结构,因此使用它作为基础实现多个数据结构是有意义的。所以如果你想把它看作一个队列,你会说这样的话(我省略了类型参数):

Queue q = new LinkedList();

如果你想将它用作堆栈,你可以这样声明:

Deque s = new LinkedList();

等等。毕竟,这一切都归结为代码重用,为什么在单个类(本例中为LinkedList)足够的情况下实现类似功能的几个不同的类?

答案 2 :(得分:1)

LinkedList实现Queue接口,因为您可能希望在某些地方使用链接列表作为队列。这意味着将队列作为输入参数的方法也可以处理链接列表。以下作品

List<String> linkedList = new LinkedList<String>();
linkedList.add("element1");
linkedList.add("element2");

Queue<String> q = (Queue<String>)linkedList; 
q.poll(); //removes and returns element1 from the linkedList

Java有一个名为java.util.Stack的独立类,它从vector扩展而来,而vector又是一个基于数组的实现。但这是一个线程安全的版本。如果您不担心线程安全,那么您可以使用ArrayDeque作为堆栈。

答案 3 :(得分:1)

基本OOD:虽然可能是模糊线,但Queue,Stack和Deque粗略地描述了您可以对集合执行的操作,因此应该是接口。 LinkedList描述了接口的实现和性能特征,因此值得成为一个类。该实现可以作为多个接口公开。对我来说,真正的问题是,“为什么Stack是一个阶级?”

答案 4 :(得分:0)

Queue是一个接口,除了LinkedList之外还有其他实现。还有一个Stack类。

最终,这看起来似乎是一个武断的决定,而基础实施并不是那么重要(IMO)。