我只看到一个 Queue 接口,Java Collections 中没有 Queue 类吗?
9 回答
Javadocs给出了实现Queue
.
所有已知的实现类:
AbstractQueue , ArrayBlockingQueue , ArrayDeque , ConcurrentLinkedQueue , DelayQueue , LinkedBlockingQueue , LinkedBlockingDeque , LinkedList , PriorityBlockingQueue , PriorityQueue , SynchronousQueue
还有一些您可能会觉得有用的子接口:
所有已知的子接口:
BlockingDeque <E>、BlockingQueue <E>、双端队列<E>
队列有多种实现:来自 API:
所有已知的实现类:
AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue,
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList,
PriorityBlockingQueue, PriorityQueue, SynchronousQueue
请注意, AbstractQueue 不是一个具体的类。
其中一些来自concurrent包,所以如果你正在实现一个jobqueue或类似的东西,你应该选择ConcurrentLinkedQueue或PriorityBlockingQueue(用于堆)ex。
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。但通常,对于队列,ArrayDeque 优于 LinkedList。因为 ArrayDeque 消耗更少的内存,速度更快并且不允许空值。不允许 null 是好的,因为如果您确实允许 null,那么当您执行 peek() 或 poll() 时,即使队列不为空,您也可以获得 null。
除了使用 API 文档查找“所有已知的实现类”外,通常还有其他非公共实现仍然可以通过公共 API 获得(仅不需要大量无意义的文档)。如果您单击“使用”,您还会发现Collections.asLifoQueue(Deque
已经是 a Queue
,但它是 FIFO 而不是堆栈)。
不,没有Queue
类,因为实现队列的方法有很多种,您必须选择适合您用例的方法。集合框架中的任何其他集合也是如此 - 例如,ArrayList
它们LinkedList
都实现了List
. 很好地使用对象继承的一般模式是:
例如,接口Queue
定义了您希望对象扮演的角色;
子接口,例如Deque
,进一步扩展或专门化角色 - 在这种情况下,“双端队列”或双端队列允许您从队列的两端添加和删除元素,而不是仅添加到后面和删除从前面;
类提供对象如何执行角色的实现。例如,一个ArrayDeque
使用可调整大小的数组来实现一个双端队列,LinkedList
它使用链表具有不同的优点和缺点。
要详细说明接口作为角色的概念,请注意,即使ArrayDeque
implements Deque
,您也可以将其用作 aQueue
而不必担心,因为实现两个接口意味着它可以同时扮演两个角色。同样,LinkedList
可以戴List
,Queue
或Deque
帽子。
出于这个原因,使用 Collections 框架之类的东西的正常(推荐)方式是对接口进行编程,即在使用类时使用接口而不是类名本身。例如,您将像这样实例化一个对象:
Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");
这样你是
- 不绑定到特定类,如果需要,可以使用直接替换,而无需修改太多代码,并且
- 通过命名它所扮演的角色来记录你对一个类所做的事情。这有帮助的一般原则是自记录代码,本质上是让代码本身是不言自明的,而不必使用注释等。
http://java.sun.com/javase/6/docs/api/java/util/Queue.html - 请参阅“所有已知的实现类”部分。有多种实现方式适用于不同的目的。
虽然答案听起来有点轻蔑,但他们实际上很酷,教你如何钓鱼。队列只是查看集合的一种方式,因此许多集合都可能实现它。同样,行为类似于集合但具有特定其他逻辑(如线程队列)的事物可能使用相同的接口。
知道在哪里查看 javadocs 是一个很大的帮助。我确定您看过但只是没想到要查看实现。活到老,学到老。
有时您可能还必须查找子类/扩展列表。就像您查看 Queue 并看到 AbstractQueue 一样,您可能想看看哪些类实现了它。
我会为你摆脱你的一个 -1 :)
import java.util.Queue;
只是
Enqueue function == Queue_Object.add(input_value);
Dequeue function == Queue_Object.pull(); //return the value and delete it from queue