目录

  • Queue
  • PriorityQueue优先队列
  • 常用方法

Queue

java获取队列深度 java队列peek_抛出异常

LinkedList 既
1.有栈的 pop,push 方法
2.有队列的 offer,poll 方法
3.有deque的 addfirst,addLast,removeFirst, removeLast 方法
4.有collection 都有的 add,remove 方法
5.有 栈和堆的 peek 方法
所以实际上LinkedList 既是栈,又是堆,还是双向队列。

  • Queue
  • PriorityQueue
  • LinkedList
  • ArrayDeque

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

LinkedList:底层使用双向链表存储,对于频繁的插入、删除操作效率更高

//add()和remove()方法在失败的时候会抛出异常(不推荐)
 Queue<String> queue = new LinkedList<String>();

queue.offer("a");//添加元素
queue.poll();//第一个元素出队列,poll() 方法在用空集合调用时不是抛出异常,只是返回 null
queue.peek());//获得队首元素,不出队列。在队列为空时,peek() 返回 null。

PriorityQueue优先队列

不过区别在于优先队列的出队操作出队的是优先级最高的元素。

思路:收集数据 + 数据排序,加一个元素排一次序(这里并不是所有元素都排序,二叉树的部分分支进行排序),最终得到一个完全二叉树,根节点是最小元素,算法将会把最小元素永远放到树顶,每次也只会取根节点的元素,也就是每取一次数据,若数据被拿出,则自动重新排序,将根节点再次变为最小的。

内部是用heap实现的,基于堆的完全二叉树,并不是真正的队列。

默认是升序排列

//降序排列
PriorityQueue<Integer> q = new PriorityQueue<>((o1,o2)->o2-o1);

常用方法

常用方法

方法1

方法2

将元素入队

add()

Queue接口规定插入失败抛出异常

add()其实调用了offer()

offer()

Queue接口规定插入失败返回false

查看队头元素

element()

失败抛出异常

peek()

失败返回false

将队首元素出队

remove()

该方法不是Queue接口内的方法,而是Collection接口的方法。

所以remove(Object o)还可以删除堆中的与给定对象相同的最先出现的对象

poll()

返回队列元素个数

size()

判断队列是否为空

isEmpty()

遍历

加强for循环,不保证输出顺序。

for (Event e : pq)

PriorityQueue方法iterator()中不保证以任何特定顺序遍历队列元素。堆仅部分排序,最小的元素位于根。

Iterator it = pq.iterator();
while(it.hasNext()){
System.out.print(it.next());
}

有序遍历,将优先队列转化成数组再排序Arrays.Sort(pq.toArray()。

注意点
1.优先队列不允许空值
2.PriorityQueue要么存储的是实现了Comparable接口的元素,要么在构造函数中传入一个Comparator对象。
3.PriorityQueue方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。