[英]Java - LinkedList push() pop() implies it is a stack, not a queue?
[英]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.