Java中的5大队列,你知道几个? (2)

无界队列:指的是没有设置固定大小的队列,但其实如果没有设置固定大小也是有默认值的,只不过默认值是 Integer.MAX_VALUE,当然实际的使用中不会有这么大的容量(超过 Integer.MAX_VALUE),所以从使用者的角度来看相当于 “无界”的。

image.png

按功能分类

接下来就是本文的重点了,我们以功能来划分一下队列,它可以被分为:普通队列、优先队列、双端队列、延迟队列、其他队列等,接下来我们分别来看。

1.普通队列

普通队列(Queue)是指实现了先进先出的基本队列,例如 ArrayBlockingQueue 和 LinkedBlockingQueue,其中 ArrayBlockingQueue 是用数组实现的普通队列,如下图所示:

image.png


而 LinkedBlockingQueue 是使用链表实现的普通队列,如下图所示:

image.png

常用方法

普通队列中的常用方法有以下这些:

offer():添加元素,如果队列已满直接返回 false,队列未满则直接插入并返回 true;

poll():删除并返回队头元素,当队列为空返回 null;

add():添加元素,此方法是对 offer 方法的简单封装,如果队列已满,抛出 IllegalStateException 异常;

remove():直接删除队头元素;

put():添加元素,如果队列已经满,则会阻塞等待插入;

take():删除并返回队头元素,当队列为空,则会阻塞等待;

peek():查询队头元素,但不会进行删除;

element():对 peek 方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出 NoSuchElementException 异常。

注意:一般情况下 offer() 和 poll() 方法配合使用,put() 和 take() 阻塞方法配合使用,add() 和 remove() 方法会配合使用,程序中常用的是 offer() 和 poll() 方法,因此这两个方法比较友好,不会报错

接下来我们以 LinkedBlockingQueue 为例,演示一下普通队列的使用:

import java.util.concurrent.LinkedBlockingQueue; static class LinkedBlockingQueueTest { public static void main(String[] args) { LinkedBlockingQueue queue = new LinkedBlockingQueue(); queue.offer("Hello"); queue.offer("Java"); queue.offer("中文社群"); while (!queue.isEmpty()) { System.out.println(queue.poll()); } } }

以上代码的执行结果如下:

Hello

Java

中文社群

2.双端队列

双端队列(Deque)是指队列的头部和尾部都可以同时入队和出队的数据结构,如下图所示:

image.png


接下来我们来演示一下双端队列 LinkedBlockingDeque 的使用:

import java.util.concurrent.LinkedBlockingDeque; /** * 双端队列示例 */ static class LinkedBlockingDequeTest { public static void main(String[] args) { // 创建一个双端队列 LinkedBlockingDeque deque = new LinkedBlockingDeque(); deque.offer("offer"); // 插入首个元素 deque.offerFirst("offerFirst"); // 队头插入元素 deque.offerLast("offerLast"); // 队尾插入元素 while (!deque.isEmpty()) { // 从头遍历打印 System.out.println(deque.poll()); } } }

以上代码的执行结果如下:

offerFirst

offer

offerLast

3.优先队列

优先队列(PriorityQueue)是一种特殊的队列,它并不是先进先出的,而是优先级高的元素先出队。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsspdw.html