26

我只看到一个 Queue 接口,Java Collections 中没有 Queue 类吗?

4

9 回答 9

37

Javadocs给出了实现Queue.

所有已知的实现类:

AbstractQueue , ArrayBlockingQueue , ArrayDeque , ConcurrentLinkedQueue , DelayQueue , LinkedBlockingQueue , LinkedBlockingDeque , LinkedList , PriorityBlockingQueue , PriorityQueue , SynchronousQueue

还有一些您可能会觉得有用的子接口:

所有已知的子接口:

BlockingDeque <E>、BlockingQueue <E>、双端队列<E>

于 2009-04-29T20:20:45.530 回答
10

队列有多种实现:来自 API:

所有已知的实现类:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue

请注意, AbstractQueue 不是一个具体的类。

其中一些来自concurrent包,所以如果你正在实现一个jobqueue或类似的东西,你应该选择ConcurrentLinkedQueue或PriorityBlockingQueue(用于堆)ex。

于 2009-04-29T20:21:35.777 回答
7

文档Queue列出了各种实现,包括

选择适合您需求的实现。

于 2009-04-29T20:20:35.703 回答
4
    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。

于 2018-01-15T22:35:53.303 回答
3

除了使用 API 文档查找“所有已知的实现类”外,通常还有其他非公共实现仍然可以通过公共 API 获得(仅不需要大量无意义的文档)。如果您单击“使用”,您还会发现Collections.asLifoQueueDeque已经是 a Queue,但它是 FIFO 而不是堆栈)。

于 2009-04-29T20:51:54.440 回答
3

不,没有Queue类,因为实现队列的方法有很多种,您必须选择适合您用例的方法。集合框架中的任何其他集合也是如此 - 例如,ArrayList它们LinkedList都实现了List. 很好地使用对象继承的一般模式是:

例如,接口Queue定义了您希望对象扮演的角色;

子接口,例如Deque,进一步扩展或专门化角色 - 在这种情况下,“双端队列”或双端队列允许您从队列的两端添加和删除元素,而不是仅添加到后面和删除从前面;

提供对象如何执行角色的实现。例如,一个ArrayDeque使用可调整大小的数组来实现一个双端队列,LinkedList它使用链表具有不同的优点和缺点。

要详细说明接口作为角色的概念,请注意,即使ArrayDequeimplements Deque,您也可以将其用作 aQueue而不必担心,因为实现两个接口意味着它可以同时扮演两个角色。同样,LinkedList可以戴ListQueueDeque帽子。

出于这个原因,使用 Collections 框架之类的东西的正常(推荐)方式是对接口进行编程,即在使用类时使用接口而不是类名本身。例如,您将像这样实例化一个对象:

Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");

这样你是

  • 不绑定到特定类,如果需要,可以使用直接替换,而无需修改太多代码,并且
  • 通过命名它所扮演的角色来记录你对一个类所做的事情。这有帮助的一般原则是自记录代码,本质上是让代码本身是不言自明的,而不必使用注释等。
于 2012-12-12T17:47:02.477 回答
2

http://java.sun.com/javase/6/docs/api/java/util/Queue.html - 请参阅“所有已知的实现类”部分。有多种实现方式适用于不同的目的。

于 2009-04-29T20:21:51.660 回答
2

虽然答案听起来有点轻蔑,但他们实际上很酷,教你如何钓鱼。队列只是查看集合的一种方式,因此许多集合都可能实现它。同样,行为类似于集合但具有特定其他逻辑(如线程队列)的事物可能使用相同的接口。

知道在哪里查看 javadocs 是一个很大的帮助。我确定您看过但只是没想到要查看实现。活到老,学到老。

有时您可能还必须查找子类/扩展列表。就像您查看 Queue 并看到 AbstractQueue 一样,您可能想看看哪些类实现了它。

我会为你摆脱你的一个 -1 :)

于 2009-04-29T21:12:18.637 回答
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
于 2010-05-22T19:10:41.330 回答