我只看到一个Queue接口,Java Collections中是否没有Queue类?
答案 0 :(得分:34)
Javadocs列出了实施Queue
。
所有已知的实施类:
AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingQueue,LinkedBlockingDeque,LinkedList ,PriorityBlockingQueue,PriorityQueue,SynchronousQueue
还有一些你可能会觉得有用的子接口:
所有已知子接口:
BlockingDeque< E>,BlockingQueue< E>,Deque< E>
答案 1 :(得分:10)
Queue有多个实现:来自API:
所有已知的实施类:
AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue,
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList,
PriorityBlockingQueue, PriorityQueue, SynchronousQueue
请注意,AbstractQueue不是具体的类。
其中一些是来自包并发的,所以如果你正在实现一个jobqueue或类似的东西,你应该去找ConcurrentLinkedQueue或PriorityBlockingQueue(对于一个堆)。
答案 2 :(得分:7)
答案 3 :(得分:3)
除了使用API文档查找“所有已知的实现类”之外,通常还有其他非公共实现可通过公共API获得(只需要不需要大量无意义的文档)。如果您点击“use”,您还会发现Collections.asLifoQueue(Deque
已经是Queue
,但它是FIFO而非堆栈。
答案 4 :(得分:3)
Queue<Integer> queue = new ArrayDeque<>();
queue.add(1);
queue.add(2);
queue.add(3);
while (!queue.isEmpty()) {
System.out.println(queue.remove());// prints 1 2 3
}
您还可以使用LinkedList。但通常,对于Queue,ArrayDeque优先于LinkedList。因为ArrayDeque消耗较少的内存,所以更快并且不允许空值。不允许null是好的,因为如果你允许空值,那么当你执行peek()或poll()时,即使队列不为空,也可以得到null。
答案 5 :(得分:2)
http://java.sun.com/javase/6/docs/api/java/util/Queue.html - 请参阅“所有已知的实现类”一节。有各种适用于不同目的的实现。
答案 6 :(得分:2)
虽然这些答案听起来有点鄙视,但通过教你如何捕鱼它们实际上非常酷。 Queue只是查看集合的一种方式,因此许多集合可以实现它。同样,像集合一样但具有特定其他逻辑(如线程队列)的东西可能使用相同的接口。
知道在哪里查看javadocs是一个很大的帮助。我确定你看了,但只是没想到看实现。生活和学习。
有时您可能还需要追逐子类/扩展列表。就像你查看Queue并看到AbstractQueue一样,你可能想看看哪些类实现了它。
对于你来说,我将摆脱你的一个-1:)
答案 7 :(得分:2)
不,没有Queue
类,因为有很多不同的方法来实现队列,你必须选择一个适合你的用例的方法。对于集合框架中的任何其他集合也是如此 - 例如,ArrayList
和LinkedList
都实现了List
。一般模式是对象继承的良好用法:
界面,例如Queue
,定义您希望对象播放的角色;
子接口,例如Deque
,进一步扩展或专门化角色 - 在这种情况下,“deque”或双端队列允许您从队列的两端添加和删除元素,而不是仅添加到后端并删除从前面;
类提供对象如何执行角色的实现。例如,ArrayDeque
使用可调整大小的数组来实现双端队列,该队列具有使用链表的LinkedList
的不同优点和缺点。
要详细说明接口作为角色的想法,请注意即使ArrayDeque
实现了Deque
,您也可以将其用作Queue
,而不必担心因为实施两个接口意味着它可以扮演两个角色。同样,LinkedList
可以佩戴List
,Queue
或Deque
帽子。
出于这个原因,使用Collections框架之类的正常(推荐)方法是编程到接口,即在使用类而不是类名本身时使用接口。例如,您将实例化一个这样的对象:
Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");
通过这种方式你
答案 8 :(得分:0)
import java.util.Queue;
就是那个
Enqueue function == Queue_Object.add(input_value);
Dequeue function == Queue_Object.pull(); //return the value and delete it from queue