Java Collections中的Queue类在哪里?

时间:2009-04-29 20:19:30

标签: java data-structures queue

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

9 个答案:

答案 0 :(得分:34)

Javadocs列出了实施Queue

的类
  

所有已知的实施类:

     

AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedQueueDelayQueueLinkedBlockingQueueLinkedBlockingDequeLinkedListPriorityBlockingQueuePriorityQueueSynchronousQueue

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

  

所有已知子接口:

     

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)

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

选择一个适合您需求的实现。

答案 3 :(得分:3)

除了使用API​​文档查找“所有已知的实现类”之外,通常还有其他非公共实现可通过公共API获得(只需要不需要大量无意义的文档)。如果您点击“use”,您还会发现Collections.asLifoQueueDeque已经是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类,因为有很多不同的方法来实现队列,你必须选择一个适合你的用例的方法。对于集合框架中的任何其他集合也是如此 - 例如,ArrayListLinkedList都实现了List。一般模式是对象继承的良好用法:

界面,例如Queue,定义您希望对象播放的角色;

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

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

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

出于这个原因,使用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