繁体   English   中英

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

[英]Java LinkedList methods for Queue and Stack

如果您查看Java的LinkedList方法,它将为Queue,Stack和Deque提供操作。

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

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

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

以下是duhhh的push和pop代码。 但为什么?

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

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

如果您查看HashMap或HashSet,它在内部使用数组,并且存在LinkedHashSet和对应的map以保持顺序。

这并不是很令人困惑,但实际上没有任何意义。

为什么Java有这样的实现?

专注于数据结构的实现:

链接列表对于频繁添加和删除非常有效。 (就像Queue和Stack通常一样,并且很少执行迭代操作)。 数组不是,它需要耗时的数组复制操作。

诸如Java的LinkedList之类的双链表是一种相当灵活的数据结构,因此以它为基础来实现多个数据结构是有意义的。 因此,如果您想将其视为一个队列,则可以这样说(我省略了类型参数):

Queue q = new LinkedList();

如果要将其用作堆栈,则可以这样声明:

Deque s = new LinkedList();

等等。 归根结底,归结为代码重用,毕竟,当单个类(在这种情况下为LinkedList)足够用时,为什么要为类似的功能实现几个不同的类?

LinkedList实现了Queue接口,因为您可能希望在某些地方将链接列表用作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用作堆栈。

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

队列是一个接口,除LinkedList外还有其他实现。 还有一个Stack类。

最终,这似乎是一个任意决定,而底层实现实际上并没有那么重要(IMO)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM