如果查看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有这样的实现?
答案 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)。