双端队列
在Java SE6中,引入了Deque接口,并由ArrayDeque和LinkedList两个类实现,都提供了双端队列,并且可以在必要时增加队列的长度,不支持在队列中间添加元素。
Priority queue
优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索,无论何时调用remove方法,总会获得当前优先级队列中最小的元素。优先级队列并没有对所有的元素进行排序,而是使用了数据结构中的堆(heap),heap是一个可以自我调整的二叉树,对树执行add和remove操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。
使用优先级队列的典型示例是任务调度,每一个任务有一个优先级,任务以随机顺序添加到队列中,每当启动一个新任务时,都将优先级最好的任务从队列中删除(习惯将1设为“最高”,所以会将最小的元素删除)
下面程序显示了一个正在运行的优先级队列,与TreeSet中的迭代不同,这里的迭代并不是按照元素的排列顺序访问的,而删除却总是删掉剩余元素中优先级最小的元素。
public class PriorityQueueTest
{
public static void main(String[] args)
{
PriorityQueue<GregorianCalendar> pq = new PriorityQueue<GregorianCalendar>();
pq.add(new GregorianCalendar(1906, Calendar.DECEMBER, 9)); // G. Hopper
pq.add(new GregorianCalendar(1815, Calendar.DECEMBER, 10)); // A. Lovelace
pq.add(new GregorianCalendar(1903, Calendar.DECEMBER, 3)); // J. von Neumann
pq.add(new GregorianCalendar(1910, Calendar.JUNE, 22)); // K. Zuse
System.out.println("Iterating over elements...");
for (GregorianCalendar date : pq)
System.out.println(date.get(Calendar.YEAR));
System.out.println("Removing elements...");
while (!pq.isEmpty())
System.out.println(pq.remove().get(Calendar.YEAR));
}
}