Java 队列 Queue 使用场景及代码示例
队列(Queue)是一种特殊的线性表,它只允许在表的前端(Front)进行删除操作,而在表的后端(Rear)进行插入操作。这种特殊的操作方式使得队列具有先进先出(FIFO,First In First Out)的特性。Java 为队列提供了丰富的实现,包括 LinkedList、PriorityQueue 等。本文将介绍 Java 队列的几种常见使用场景,并提供相应的代码示例。
场景一:任务调度
在多线程环境中,队列常用于任务调度。生产者将任务放入队列,消费者从队列中取出任务并执行。这种方式可以有效地实现线程间的同步和任务分发。
import java.util.LinkedList;
import java.util.Queue;
public class TaskScheduler {
private Queue<Runnable> taskQueue = new LinkedList<>();
public void addTask(Runnable task) {
taskQueue.add(task);
}
public void executeTask() {
Runnable task = taskQueue.poll();
if (task != null) {
task.run();
}
}
}
场景二:缓存实现
队列可以用于实现缓存,特别是 LRU(Least Recently Used)缓存。当缓存达到最大容量时,最近最少使用的数据将被移除。
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
场景三:广度优先搜索(BFS)
在图的遍历算法中,队列常用于实现广度优先搜索(BFS)。BFS 从起点开始,逐层遍历图中的所有顶点。
import java.util.LinkedList;
import java.util.Queue;
public class GraphBFS {
private int V; // 顶点数
private LinkedList<Integer> adj[];
GraphBFS(int v) {
V = v;
adj = new LinkedList[v];
for (int i = 0; i < v; ++i)
adj[i] = new LinkedList<>();
}
void addEdge(int v, int w) {
adj[v].add(w);
}
void BFS(int s) {
boolean visited[] = new boolean[V];
for (int i = 0; i < V; i++)
visited[i] = false;
Queue<Integer> queue = new LinkedList<>();
queue.add(s);
visited[s] = true;
while (!queue.isEmpty()) {
s = queue.poll();
System.out.print(s + " ");
Iterator<Integer> i = adj[s].listIterator();
while (i.hasNext()) {
int n = i.next();
if (!visited[n]) {
queue.add(n);
visited[n] = true;
}
}
}
}
}
旅行图的绘制
以下是使用 Mermaid 语法绘制的旅行图示例:
journey
title 旅行图
section 出发
Depart: 出发点 --> 到达点
section 到达
到达点: 到达点 --> 探索点
section 探索
探索点: 探索点 --> 回家点
section 回家
回家点: 回家点
表格示例
以下是使用 Markdown 语法的表格示例:
| 姓名 | 年龄 | 职业 |
| ------ | ---- | ------ |
| 张三 | 28 | 教师 |
| 李四 | 34 | 工程师 |
| 王五 | 22 | 学生 |
结语
Java 队列的应用场景非常广泛,从任务调度到缓存实现,再到图的遍历算法,队列都发挥着重要的作用。通过本文的介绍和代码示例,希望能帮助读者更好地理解和使用 Java 队列。在实际开发中,根据具体需求选择合适的队列实现,可以提高程序的性能和可维护性。