LinkedList、ArrayDeque 都是Queue 接口的子类,还是有必要把Queue 这个接口的源码再过一遍,让我们站在更高层来看这几个类。
说到 Queue(队列),我们会想到先进先出这个概念。 在 Java 中,Queue 接口是一个定义队列数据结构的接口,位于 java.util 包中。
Queue 接口扩展了 Collection 接口,表示一种 先进先出(FIFO) 的数据结构,用于按顺序存储并操作元素。
我们可以通过 Queue 实现类(如 LinkedList、PriorityQueue、ArrayDeque 等)来使用具体的队列实现。
一、Queue 接口中的方法
Queue 接口定义了几个核心方法,主要用于插入、删除和查看队列中的元素。方法可以分为两类:抛出异常 和 返回特定值 的方法。
1. 添加元素的方法
boolean add(E e):将指定的元素插入到队列中。如果队列已满(主要在有限容量的队列实现中),则抛出 IllegalStateException 异常。该方法返回 true,表示元素成功插入。
boolean offer(E e):将指定的元素插入到队列中。如果队列已满,则返回 false,而不是抛出异常。这个方法通常用于限制容量的队列(如阻塞队列)中。
add方法与offer方法的区别在于:add在插入失败时抛出异常,而offer则返回false。
2. 移除元素的方法
E remove():移除并返回队列的头部元素。如果队列为空,则抛出 NoSuchElementException。
E poll():移除并返回队列的头部元素。如果队列为空,则返回 null。
remove和poll的区别在于:remove在队列为空时抛出异常,而poll返回null。
3. 查看元素的方法
E element():返回队列的头部元素,但不删除。如果队列为空,则抛出 NoSuchElementException。
E peek():返回队列的头部元素,但不删除。如果队列为空,则返回 null。
element和peek的区别在于:element在队列为空时抛出异常,而peek返回null。
4、方法总结
二、示例代码
为了帮助理解这些方法,下面是一个使用 Queue 接口及其实现 LinkedList 的示例代码:
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
// 使用 add() 方法添加元素
queue.add(10);
queue.add(20);
queue.add(30);
System.out.println("队列元素: " + queue); // 输出: [10, 20, 30]
// 使用 element() 方法获取头部元素
System.out.println("队列头部元素 (element): " + queue.element()); // 输出: 10
// 使用 remove() 方法删除头部元素
System.out.println("移除元素 (remove): " + queue.remove()); // 输出: 10
System.out.println("队列元素: " + queue); // 输出: [20, 30]
// 使用 offer() 添加元素
queue.offer(40);
System.out.println("队列元素 (offer 后): " + queue); // 输出: [20, 30, 40]
// 使用 poll() 方法删除头部元素
System.out.println("移除元素 (poll): " + queue.poll()); // 输出: 20
System.out.println("队列元素: " + queue); // 输出: [30, 40]
// 使用 peek() 方法查看头部元素
System.out.println("队列头部元素 (peek): " + queue.peek()); // 输出: 30
}
}
运行结果:
队列元素: [10, 20, 30]
队列头部元素 (element): 10
移除元素 (remove): 10
队列元素: [20, 30]
队列元素 (offer 后): [20, 30, 40]
移除元素 (poll): 20
队列元素: [30, 40]
队列头部元素 (peek): 30
三、Queue的设计思路
Queue 的设计使得用户可以轻松实现 FIFO 行为,同时根据需求选择抛出异常或返回特定值的操作。
Queue 的接口中没有提供直接的遍历方法,这是因为队列的核心功能在于元素的插入、删除和查看,而不是随机访问。对于队列的遍历,一般可以使用 迭代器。
Queue 可以用作底层数据结构,实现多种算法(如广度优先搜索)和系统功能(如任务调度)。
四、Queue的常用实现类
LinkedList:LinkedList 是 Queue 接口的实现之一,支持 null 元素,适合在需要频繁插入和删除的场景下使用。
PriorityQueue:基于优先级堆的实现,按元素的自然顺序(或通过 Comparator 指定的顺序)排序,不允许 null 元素。
ArrayDeque:基于动态数组实现的双端队列,支持队列的所有操作,且效率较高,不允许 null 元素。
五、最后总结
Queue 接口定义了 Java 中队列的基本行为,提供了对元素的插入、移除和查看的规范,用户可以基于其实现类来选择适合的队列类型。通过区分抛出异常和返回 null 的方法,Queue 提供了较高的灵活性,适合在不同场景中使用。
领取专属 10元无门槛券
私享最新 技术干货