队列是一种先进先出的数据结构。元素被追加到队列末尾,然后从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级的元素首先被删除。
Queue接口用附加的插入、提取和检验操作来扩展java.util.Collection。方法offer()用于向队列添加一个元素,类似Collection中的add方法,但是offer更适用于队列。方法poll()和remove()劣势,但如果队列为空,方法poll()会返回null,remove会抛出一个异常。方法peek()和element()类似,但是如果队列为空,peek()返回null,element()会抛出一个异常。
双端队列Deque(Double-ended queue) 支持在两端插入和删除元素。Deque接口用附加的从队列两端插入和删除元素的办法扩展Queue接口。方法addFirst()、removeFirst()、addLast()、removeLast()、getFirst()、和getLast()都定义在Deque接口中。LinkedList类实现了Deque接口,Deque又扩展了Queue接口。因此,可以使用LinkedList创建一个队列。
下面给出一个使用队列存储字符串的例子
/**
* @author lxd
* 2015-06-14
*/
public class TestQueue {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("BeiJing");
queue.offer("ShangHai");
queue.offer("GuangZhou");
queue.offer("ShenZhen");
queue.offer("DaLian");
while (queue.size() > 0) {
//获取并删除队列头,如果队列为空则抛出一个异常
System.out.print(queue.remove() + " ");
}
}
}
结果:
BeiJing ShangHai GuangZhou ShenZhen DaLian
PriorityQueue类实现一个优先队列,默认情况下,优先队列使用Comparable以元素的自然顺序进行排序。拥有最小数值的元素被赋予最高优先级。因此,最先从队列中删除。如果几个元素具有相同的最高优先级,其中的任意一个都可以从队列中删除。也可以使用构造方法PriorityQueue(initialCapacity, comparator)中的comparator来指定一个顺序。
下面是一个使用优先队列存储字符串的例子。
import java.util.Collections;
import java.util.PriorityQueue;
/**
* @author lxd
* 2015-06-14
*/
public class TestPriorityQueue {
public static void main(String[] args) {
//以字符串的自然顺序排序,升序从队列中删除
PriorityQueue<String> queue = new PriorityQueue<String>();
//添加元素
queue.offer("BeiJing");
queue.offer("ShangHai");
queue.offer("GuangZhou");
queue.offer("ShenZhen");
queue.offer("DaLian");
System.out.println("queue using Comparable:");
while (queue.size() > 0) {
System.out.print(queue.remove() + " ");
}
//以逆序方式对元素排序,字符串以降序从队列中删除
PriorityQueue<String> queue2 = new PriorityQueue<String>(4, Collections.reverseOrder());
//添加元素
queue2.offer("BeiJing");
queue2.offer("ShangHai");
queue2.offer("GuangZhou");
queue2.offer("ShenZhen");
queue2.offer("DaLian");
System.out.println("\nqueue using Comparator:");
while (queue2.size() > 0) {
System.out.print(queue2.remove() + " ");
}
}
}
结果:
queue using Comparable:
BeiJing DaLian GuangZhou ShangHai ShenZhen
queue using Comparator:
ShenZhen ShangHai GuangZhou DaLian BeiJing
Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。
Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。
Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。