如何用java队列


使用 Java 队列的基本方法
Java 提供了多种队列实现,包括 LinkedList、ArrayDeque 和 PriorityQueue,以及线程安全的 BlockingQueue 实现类。以下是常见队列操作示例。
导入队列相关类
import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayDeque;
import java.util.PriorityQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
创建队列实例
// 使用 LinkedList 实现队列
Queue<Integer> linkedListQueue = new LinkedList<>();
// 使用 ArrayDeque 实现队列
Queue<String> arrayDequeQueue = new ArrayDeque<>();
// 优先级队列(元素按自然顺序或 Comparator 排序)
Queue<Double> priorityQueue = new PriorityQueue<>();
// 线程安全的阻塞队列(固定容量为 10)
BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(10);
基本队列操作
// 添加元素到队尾
linkedListQueue.offer(5); // 推荐使用(不抛异常)
linkedListQueue.add(10); // 可能抛 IllegalStateException
// 获取并移除队头元素
Integer head1 = linkedListQueue.poll(); // 返回 null 如果队列为空
Integer head2 = linkedListQueue.remove(); // 抛 NoSuchElementException 如果队列为空
// 查看但不移除队头元素
Integer peek = linkedListQueue.peek(); // 返回 null 如果队列为空
Integer element = linkedListQueue.element(); // 抛 NoSuchElementException
特殊队列用法示例
双端队列操作(ArrayDeque)
ArrayDeque<Character> deque = new ArrayDeque<>();
deque.addFirst('A'); // 添加到队头
deque.addLast('Z'); // 添加到队尾
char first = deque.removeFirst();
char last = deque.removeLast();
优先级队列自定义排序
// 使用自定义 Comparator
Queue<Person> priorityQueue = new PriorityQueue<>(
(p1, p2) -> p1.getAge() - p2.getAge()
);
priorityQueue.offer(new Person("Alice", 30));
priorityQueue.offer(new Person("Bob", 25));
// 出队顺序按年龄从小到大
阻塞队列线程安全操作
BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(3);
// 生产者线程
new Thread(() -> {
try {
bQueue.put("Message1"); // 阻塞直到有空间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
// 消费者线程
new Thread(() -> {
try {
String msg = bQueue.take(); // 阻塞直到有元素
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
队列实现的性能比较
LinkedList:支持所有队列操作,适合频繁插入/删除ArrayDeque:比 LinkedList 更高效的内存使用,适合大多数队列场景PriorityQueue:O(log n) 时间复杂度的插入/删除,适合需要排序的场景ArrayBlockingQueue:线程安全,固定容量,适合生产者-消费者模式
注意:选择具体实现时应根据是否需要线程安全、排序功能或特殊操作(如双端操作)来决定。






