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 队列。在实际开发中,根据具体需求选择合适的队列实现,可以提高程序的性能和可维护性。