java如何使用队列
队列的基本概念
队列是一种先进先出(FIFO)的数据结构,元素从队尾添加(入队),从队头移除(出队)。Java提供了多种实现队列的方式,包括内置接口和类。
使用Queue接口
Java的Queue接口定义了队列的基本操作,常用实现类包括LinkedList和PriorityQueue。

import java.util.Queue;
import java.util.LinkedList;
Queue<String> queue = new LinkedList<>();
queue.add("A"); // 入队,失败时抛出异常
queue.offer("B"); // 入队,失败时返回false
String head = queue.remove(); // 出队,队列为空时抛出异常
head = queue.poll(); // 出队,队列为空时返回null
String peek = queue.element(); // 查看队头,队列为空时抛出异常
peek = queue.peek(); // 查看队头,队列为空时返回null
使用Deque实现双端队列
Deque(双端队列)支持从两端操作元素,既可以作为队列也可以作为栈。
import java.util.Deque;
import java.util.ArrayDeque;
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1); // 队头添加
deque.addLast(2); // 队尾添加
int first = deque.removeFirst(); // 队头移除
int last = deque.removeLast(); // 队尾移除
优先队列PriorityQueue
优先队列根据元素的优先级出队,默认按自然顺序排序,也可通过Comparator自定义。

import java.util.PriorityQueue;
import java.util.Comparator;
Queue<Integer> pq = new PriorityQueue<>();
pq.offer(3);
pq.offer(1);
pq.offer(2);
while (!pq.isEmpty()) {
System.out.println(pq.poll()); // 输出顺序:1, 2, 3
}
// 自定义排序
Queue<String> customPq = new PriorityQueue<>(Comparator.reverseOrder());
customPq.offer("B");
customPq.offer("A");
System.out.println(customPq.poll()); // 输出:B
阻塞队列BlockingQueue
适用于多线程场景,当队列为空或满时,操作会阻塞或等待。常用实现类为LinkedBlockingQueue和ArrayBlockingQueue。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
BlockingQueue<String> bq = new LinkedBlockingQueue<>(2);
bq.put("X"); // 阻塞直到队列有空位
String item = bq.take(); // 阻塞直到队列有元素
线程安全的队列
ConcurrentLinkedQueue是无锁线程安全队列,适合高并发场景。
import java.util.concurrent.ConcurrentLinkedQueue;
ConcurrentLinkedQueue<String> clq = new ConcurrentLinkedQueue<>();
clq.offer("Task");
String task = clq.poll();
注意事项
- 选择队列实现时需考虑线程安全、容量限制和性能需求。
LinkedList支持null元素,但ArrayDeque和PriorityQueue不支持。- 阻塞队列在多线程编程中常用于生产者-消费者模型。





