在Java中,队列(Queue)是一种常用的数据结构,遵循FIFO(先进先出)原则。Java提供了多种队列实现方式,适用于不同的场景。以下是几种常见的队列实现方式:
- LinkedList实现
LinkedList
实现了Queue
接口,可以作为队列使用,它是一个双向链表结构。
import java.util.LinkedList;
import java.util.Queue;public class LinkedListQueueExample {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();// 添加元素queue.add("元素1");queue.offer("元素2");// 获取队头元素(不删除)System.out.println("队头元素: " + queue.peek());// 获取并删除队头元素while (!queue.isEmpty()) {System.out.println("出队元素: " + queue.poll());}}
}
- ArrayDeque实现
ArrayDeque
是基于数组的双端队列,既可以作为队列使用,也可以作为栈使用,性能通常比LinkedList
更好。
import java.util.ArrayDeque;
import java.util.Queue;public class ArrayDequeQueueExample {public static void main(String[] args) {Queue<Integer> queue = new ArrayDeque<>();// 添加元素for (int i = 1; i <= 5; i++) {queue.offer(i);}// 遍历队列System.out.println("队列元素: " + queue);// 出队操作while (!queue.isEmpty()) {System.out.println("出队: " + queue.poll());}}
}
- PriorityQueue实现
PriorityQueue
是一个优先级队列,它不是按照元素的插入顺序,而是按照元素的优先级进行排序。
import java.util.PriorityQueue;
import java.util.Queue;public class PriorityQueueExample {public static void main(String[] args) {// 自然排序(从小到大)Queue<Integer> priorityQueue = new PriorityQueue<>();// 添加元素priorityQueue.offer(3);priorityQueue.offer(1);priorityQueue.offer(5);priorityQueue.offer(2);// 出队(按优先级顺序)while (!priorityQueue.isEmpty()) {System.out.println("出队: " + priorityQueue.poll());}}
}
- ConcurrentLinkedQueue实现
ConcurrentLinkedQueue
是一个线程安全的无界队列,适用于多线程环境。
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;public class ConcurrentQueueExample {public static void main(String[] args) throws InterruptedException {Queue<String> concurrentQueue = new ConcurrentLinkedQueue<>();// 线程1:添加元素Thread producer = new Thread(() -> {for (int i = 1; i <= 5; i++) {concurrentQueue.offer("元素" + i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}});// 线程2:取出元素Thread consumer = new Thread(() -> {while (true) {String element = concurrentQueue.poll();if (element != null) {System.out.println("消费: " + element);}if (element != null && element.equals("元素5")) {break;}try {Thread.sleep(150);} catch (InterruptedException e) {e.printStackTrace();}}});producer.start();consumer.start();producer.join();consumer.join();}
}
- 阻塞队列实现
Java提供了多种阻塞队列,如ArrayBlockingQueue
、LinkedBlockingQueue
等,它们在队列为空或满时会阻塞线程。
选择哪种队列实现取决于具体需求:
- 单线程环境且需要简单队列:
LinkedList
或ArrayDeque
- 需要优先级排序:
PriorityQueue
- 多线程环境:
ConcurrentLinkedQueue
- 需要线程阻塞功能:各种阻塞队列(如
ArrayBlockingQueue
)
阻塞队列特别适合生产者-消费者模式,能够很好地协调生产和消费速度,避免忙等待。