我只看到了一个队列接口,Java集合框架中没有队列类吗?
Javadocs中提供了一些实现Queue
的类列表。
所有已知实现类:
AbstractQueue、ArrayBlockingQueue、ArrayDeque、ConcurrentLinkedQueue、DelayQueue、LinkedBlockingQueue、LinkedBlockingDeque、LinkedList、PriorityBlockingQueue、PriorityQueue和SynchronousQueue
此外,还有一些子接口可能会对您有用:
已知所有子接口:BlockingDeque<E>, BlockingQueue<E>, Deque<E>
队列有多种实现方式:根据API文档:
所有已知的实现类:
AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue,
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList,
PriorityBlockingQueue, PriorityQueue, SynchronousQueue
注意,AbstractQueue不是一个具体的类。
其中一些来自concurrent包,因此如果你正在实现一个作业队列或类似的东西,你应该选择ConcurrentLinkedQueue或PriorityBlockingQueue(对于堆)。
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。不允许null很好,因为如果允许null,在执行peek()或poll()时,即使队列不为空,您也可能会得到null。
Queue
类,因为有很多不同的方法可以实现队列,你必须选择适合你使用情况的方法。与集合框架中的任何其他集合一样,例如,ArrayList
和 LinkedList
都实现了一个 List
。通常模式(这是对象继承的良好用法)是:Queue
,定义了你想让对象扮演的角色;
- 子接口,例如 Deque
,进一步扩展或专业化角色 - 在这种情况下,“deque” 或双端队列允许您从队列的两端添加和删除元素,而不仅仅是从后面添加并从前面删除;
- 类提供了如何执行对象的角色的实现。例如,ArrayDeque
使用可调整大小的数组来实现双端队列,它具有不同的优缺点,与使用链表的 LinkedList
不同。ArrayDeque
实现了 Deque
,您也可以将其用作 Queue
,而无需担心,因为实现两个接口意味着它可以扮演两个角色。同样,LinkedList
可以戴上列表、队列或双端队列的帽子。Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");
通过这种方式,您不会被绑定到特定的类中,如果需要替换,也不需要修改太多代码,
Deque
已经是Queue
,但它是FIFO而不是堆栈)。http://java.sun.com/javase/6/docs/api/java/util/Queue.html -- 查看“所有已知的实现类”部分。有许多适用于不同目的的实现。
import java.util.Queue;
就是这样
Enqueue function == Queue_Object.add(input_value);
Dequeue function == Queue_Object.pull(); //return the value and delete it from queue
Queue<MyObject> myQueue = new LinkedList<MyObject>()
,这将强制您遵循在接口中声明的队列操作(例如add/remove)。 - Michael Myers