Queue,Deque,PriorityQueue
Queue
队列的特点是向末尾添加元素,从队列头删除元素,队列中允许有重复元素。
1. 加入元素的方法:
boolean add(E element)//E是泛型类型
boolean offer(E element)
如果添加成功返回true。如果队列已满,add()方法会抛出IllegalStateException,offer()方法返回false。
2. 删除元素的方法:
E remove()
E poll()
如果队列为空,remove()方法会抛出NoSuchElementEcxeption,poll()方法返回null。
3. 获取元素的方法:
E element()
E peek()
如果队列为空,element()方法抛出NoSuchElementException,peek()方法返回null。
Deque
Deque是Queue的子接口,表示双向队列。可以在队头和队尾添加或删除元素。
1. 向队头或队尾添加元素的方法:
void addFirst(E element)
void addLast(E element)
boolean offerFirst(E element)
boolean offerLast(E element)
如果队列已满,前2个方法会抛出IllegalStateException,后2个方法返回false。
2. 从队头或队尾删除元素的方法:
E removeFirst()
E removeLast()
E pollFirst()
E pollLast()
如果队列为空,前2个方法会抛出NoSuchElementEcxeption,后2个方法返回null。
3. 从队头或队尾获取元素的方法:
E getFirst()
E getLast()
E peekFirst()
E peekLast()
如果队列为空,前2个方法会抛出NoSuchElementEcxeption,后2个方法返回null。
PriorityQueue
PriorityQueue(优先级队列)会按照排序的方式对队列中的元素进行排序和检索。所以加入到PriorityQueue中的对象必须实现Comparable接口,提供对元素排序时的比较规则。
示例:
import java.util.*;
public class Tester {
public static void main(String[] args) {
Queue<Integer> pq = new PriorityQueue<>();
pq.add(13);
pq.add(24);
pq.add(10);
pq.add(30);
System.out.println("遍历队列:");
for(Integer e:pq) {
System.out.print(" "+e);
}
System.out.println();
System.out.println("依次删除队列中的元素:");
while(pq.isEmpty()==false) {
System.out.print(" "+pq.remove());
}
}
}
/*
输出结果:
遍历队列:
10 24 13 30
依次删除队列中的元素:
10 13 24 30
*/
通过foreach遍历时,取得的元素并没有进行排序,而在调用remove()方法时,该方法总会删除当前队列中最小的元素,所以删除结果是10,13,24,30。
优先级队列的底层实现原理是通过二叉小顶堆实现的(用一棵完全二叉树表示[任意一个非叶子节点的权值都不大于其左右子节点的权值]),所以add()方法执行如下图:
先加入13,然后加入24,都满足定义,当加入10的时候,10<13,所以10和13位置调换,最后加入30,满足定义。
遍历输出的时候是采用层次遍历,所以输出结果为10,24,13,30.
上一篇: 递归