双端队列(deuqe)
在队头和队尾都能高效地添加或删除元素,不支持在队列中间添加元素。Java6中引入了Deque接口,ArrayDeque和LinkedList类都实现了这个接口,这两个类都可以提供双端队列,大小根据需要调整。
API:
1、java.util.Queue<E> 5
boolean add(E element)
E remove()
E poll() --- 如果队列不为空,删除并返回这个队列队头的元素。如果队列是空的,第一个方法抛 出 NoSuchElementException,而第二个方法返回 null。
E element()
E peek() --- 如果队列不为空,返回这个队列队头的元素,但不删除这个元素。如果队列为空,第 一个方法将抛出一个NoSuchElementException,而第二个方法返回null。
2、java.util.Deque<E> 6
void addFirst(E element)
void addLastfE element)
boolean offerFirst(E element)
优先队列
优先队列(priority queue)中的元素可以按照任意的顺序插入,但会按照有序的顺序获取,即调用remove方法时,总会获取当前优先队列中最小的元素,但优先队列并没有对所有元素进行排序,如果迭代处理这些元素,并不需要进行排序。优先队列使用了堆数据结构(heap),堆是一个自组织的二叉树,其添加(add)和删除(remove)操作会将最小的元素移动到根,而不必花费时间对元素进行排序。
优先队列既可以实现了Comparable接口的类对象,也可以包含构造器中提供的Comparator对象。
优先队列的典型用法是任务调度,每一个任务有一个优先级,任务以随机顺序添加到队列中,每启动一个新任务时,将从队列中删除优先级最高的任务。
示例程序:一个优先队列的具体使用,与TreeSet中迭代不同,这里的迭代不是按照有序顺序来访问元素的,但是删除操作总是删除剩余元素中最小的那个元素。
附录:API
1、java.util.PriorityQueue 5