Queue接口
以下是对 Queue 接口的详细解析,结合代码注释和使用场景说明:
1. Queue 接口概述
Queue 是 Java 集合框架中的队列接口,继承自 Collection,定义了一组队列特有的操作。队列通常按 FIFO(先进先出) 规则排序,但也支持其他排序方式(如优先级队列、LIFO 栈)。
核心特点:
- 双模式方法:每个操作有两种形式,一种抛出异常,另一种返回特殊值(如
null/false)。 - 常用场景:任务调度、消息队列、生产者-消费者模型等。
2. 核心方法对比
插入元素 |
|
|
容量不足时抛异常,
返回
|
移除元素 |
|
|
队列为空时抛异常,
返回
|
查看元素 |
|
|
队列为空时抛异常,
返回
|
3. 方法详解与示例
3.1 插入元素
- boolean add(E e)尝试插入元素,容量不足时抛 IllegalStateException。
- boolean offer(E e)插入成功返回 true,失败返回 false(如容量限制时)。
3.2 移除元素
- E remove()移除并返回队首元素,队列为空时抛 NoSuchElementException。
- E poll()移除并返回队首元素,队列为空时返回 null。
3.3 查看元素
- E element()返回队首元素,队列为空时抛 NoSuchElementException。
- E peek()返回队首元素,队列为空时返回 null。
4. 常用实现类
| 基于双向链表,支持 FIFO,允许
,线程不安全 |
| 按自然顺序或自定义比较器排序,不允许
,线程不安全 |
| 基于数组,高效插入/删除,支持双端队列(
),不允许
|
| 线程安全,基于链表,适用于高并发场景 |
5. 与其他接口的区别
| 有序集合,支持索引操作(如
),允许重复元素 |
| 无序集合,元素唯一,不允许重复 |
| 按特定规则排序(如 FIFO),支持队列操作(如
、
) |
6. 典型应用场景
- 生产者-消费者模型:使用
BlockingQueue实现线程间安全通信。 - 任务调度:按优先级处理任务(
PriorityQueue)。 - 缓存淘汰:使用 FIFO 策略管理缓存(
LinkedList或ArrayDeque)。
7. 注意事项
null元素:大多数Queue实现不允许插入null(如PriorityQueue),但LinkedList允许。- 线程安全:默认实现(如
LinkedList)是非线程安全的,需使用ConcurrentLinkedQueue或BlockingQueue。 - 容量限制:固定容量队列需通过
offer()判断插入是否成功。
完整示例
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// 插入元素
queue.offer("Alice");
queue.offer("Bob");
queue.offer("Charlie");
// 查看队首元素
System.out.println("Head: " + queue.peek()); // Head: Alice
// 遍历队列(需注意顺序)
while (!queue.isEmpty()) {
System.out.println("Polled: " + queue.poll());
}
// 输出:
// Polled: Alice
// Polled: Bob
// Polled: Charlie
}
}
总结
Queue 接口为队列操作提供了统一规范,通过不同实现类可满足多种场景需求。在实际开发中,需根据线程安全、容量限制和排序策略选择合适的实现类。
Java集合框架 文章被收录于专栏
Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。
查看13道真题和解析