超全面Java中的队列(Queue)

简介: Java中的`Queue`接口位于`java.util`包,继承自`Collection`,用于存储待处理的元素,通常遵循FIFO原则。它包含`add`、`offer`、`poll`等方法,支持多种实现类,如`LinkedList`、`PriorityQueue`、`ArrayDeque`、`ConcurrentLinkedQueue`及`BlockingQueue`系列。

在Java中,Queue接口是java.util包的一部分,继承自Collection接口,用于在处理前保存元素。它遵循FIFO(先进先出)原则,但优先级队列和LIFO队列除外。以下是关于Java队列的超全面介绍:

1. Queue接口的基本方法

方法 描述 异常情况(失败时) 返回特殊值(失败时)
add(e) 添加元素到队列尾部 IllegalStateException false
offer(e) 尝试添加元素(更适合有容量限制的队列) - false
remove() 移除并返回队首元素 NoSuchElementException -
poll() 移除并返回队首元素(队列为空时返回null - null
element() 返回队首元素(不移除) NoSuchElementException -
peek() 返回队首元素(不移除,队列为空时返回null - null

2. 常用实现类

2.1 LinkedList

  • 特点:实现了QueueDeque接口,支持双向队列操作。
  • 适用场景:频繁插入/删除元素的场景。
Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // 输出: A

2.2 PriorityQueue

  • 特点:基于优先级堆实现,元素按自然顺序或指定比较器排序。
  • 注意:不允许null元素,非线程安全。
Queue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.offer(3);
priorityQueue.offer(1);
System.out.println(priorityQueue.poll()); // 输出: 1(最小元素优先)

2.3 ArrayDeque

  • 特点:动态数组实现的双端队列,不允许null元素。
  • 优势:无容量限制,比LinkedList在队列操作上更高效。
Deque<String> deque = new ArrayDeque<>();
deque.offerFirst("A");
deque.offerLast("B");
System.out.println(deque.pollLast()); // 输出: B

2.4 ConcurrentLinkedQueue

  • 特点:基于链表的无界线程安全队列,采用CAS(Compare-and-Swap)操作。
  • 适用场景:高并发环境。
Queue<String> concurrentQueue = new ConcurrentLinkedQueue<>();
concurrentQueue.offer("Task1");
concurrentQueue.poll(); // 线程安全操作

2.5 BlockingQueue接口及实现类

用于线程间通信,支持阻塞操作(如put()take())。

  • ArrayBlockingQueue:有界数组实现的阻塞队列。
  • LinkedBlockingQueue:可选有界的链表阻塞队列。
  • PriorityBlockingQueue:支持优先级的无界阻塞队列。
  • DelayQueue:延迟元素的无界阻塞队列,元素必须实现Delayed接口。
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(10);
blockingQueue.put("Item"); // 队列满时阻塞
String item = blockingQueue.take(); // 队列空时阻塞

3. 双端队列(Deque)

Deque接口继承自Queue,支持两端元素插入和删除。

  • 常用方法
    • addFirst(e)/offerFirst(e)
    • addLast(e)/offerLast(e)
    • removeFirst()/pollFirst()
    • removeLast()/pollLast()
    • getFirst()/peekFirst()
    • getLast()/peekLast()
Deque<Integer> deque = new ArrayDeque<>();
deque.push(1); // 等价于 addFirst()
deque.push(2);
System.out.println(deque.pop()); // 输出: 2(LIFO栈操作)

4. 队列与线程安全

  • 非线程安全队列LinkedListPriorityQueueArrayDeque
  • 线程安全队列
    • ConcurrentLinkedQueue:非阻塞线程安全队列。
    • BlockingQueue及其实现类:阻塞线程安全队列。

示例:生产者-消费者模式

BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();

// 生产者线程
new Thread(() -> {
   
    try {
   
        queue.put(1);
    } catch (InterruptedException e) {
   
        Thread.currentThread().interrupt();
    }
}).start();

// 消费者线程
new Thread(() -> {
   
    try {
   
        Integer item = queue.take();
    } catch (InterruptedException e) {
   
        Thread.currentThread().interrupt();
    }
}).start();

5. 队列的应用场景

  • 消息队列:实现异步处理(如RabbitMQ、Kafka)。
  • 任务调度:按顺序执行任务。
  • 广度优先搜索(BFS):使用队列存储待处理节点。
  • 缓存淘汰策略:FIFO缓存(如LinkedHashMapremoveEldestEntry方法)。

6. 注意事项

  • 避免null元素:多数队列实现不允许nullPriorityQueueConcurrentLinkedQueue会直接抛出异常。
  • 容量限制:有界队列(如ArrayBlockingQueue)需处理满队列情况,避免阻塞或拒绝操作。
  • 迭代器:队列的迭代器可能是弱一致性的,尤其是并发队列。

总结

队列类型 有序性 线程安全 有界性 适用场景
LinkedList FIFO 无界 灵活的双向队列操作
PriorityQueue 优先级 无界 按优先级处理元素
ArrayDeque FIFO/LIFO 动态扩容 高效的双端操作
ConcurrentLinkedQueue FIFO 无界 高并发场景
ArrayBlockingQueue FIFO 有界 固定容量的线程安全队列
DelayQueue 延迟时间 无界 延迟任务调度

根据具体需求选择合适的队列实现,兼顾性能与线程安全。

目录
相关文章
|
消息中间件 存储 运维
Rabbitmq消息大量堆积怎么办?
该文讨论了一个系统架构问题,主要涉及RabbitMQ在处理订单消息时遇到的性能瓶颈。首先,系统使用RabbitMQ是为了解耦和提高性能,前端创建订单后通过RabbitMQ发送消息给订单履约系统消费并执行后续操作。当订单流量激增时,消息堆积导致服务器压力增加。 排查解决方案: 1. 增加消费者以提高消费速度,但发现即使增加消费者,消息堆积问题仍未解决。 2. 分析消费者逻辑,发现调用库存系统接口可能导致处理速度慢。库存系统压力大,接口响应慢,加剧问题。 3. 实施清空堆积消息的策略,新建消费者快速消费消息并存储在表中,减轻服务器压力。待库存服务恢复后,再将消息推回RabbitMQ处理。
809 1
|
4月前
|
搜索推荐 算法 Java
2025 年互联网大厂校园招聘 JAVA 工程师笔试题及备考要点解析
本文针对互联网大厂校招Java工程师笔试题进行解析,涵盖基础知识、面向对象编程、数据结构与算法、异常处理及集合框架等核心内容。从数据类型、运算符到流程控制语句,从类与对象、继承多态到数组链表、排序算法,再到异常捕获与集合框架应用,结合实际案例深入剖析,助你系统掌握考点,提升应试能力。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
168 9
|
存储 网络协议 物联网
Android集成MQTT教程:实现高效通信和实时消息传输
Android集成MQTT教程:实现高效通信和实时消息传输
3204 0
|
Java Go Nacos
Spring Cloud Alibaba Nacos配置导入问题解决方案
Spring Cloud Alibaba Nacos配置导入问题解决方案
2242 0
|
存储 安全 Java
解析 Java 的 MultipartFile 接口:实现文件上传的全面指南
在现代的 Web 开发中,文件上传是一个常见的需求,而 Java 中的 `MultipartFile` 接口正是用来处理这类任务的重要工具。无论是上传图片、音频、视频还是其他文件类型,`MultipartFile` 都提供了便捷的方法来处理文件的接收和存储。本文将带您深入探索 Java 中的 `MultipartFile` 接口,揭示其功能、用法以及在实际开发中的应用场景。
|
3月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
757 0
|
存储 安全 Java
深入探索Java并发编程:ArrayBlockingQueue详解
深入探索Java并发编程:ArrayBlockingQueue详解
|
监控 JavaScript Java
JVM源码级别分析G1发生FullGC元凶的是什么
线上系统遭遇频繁Old GC问题,监控显示出现多次“to-space exhausted”日志,这表明垃圾回收过程中因年轻代 Survivor 区或老年代空间不足导致对象晋升失败。通过 JVM 源码分析,此问题源于对象转移至老年代失败时,JVM 无法找到足够的空间存放存活对象。进一步排查发现大对象分配占用了预留空间,加剧了空间不足的情况。使用 JFR 分析工具定位到定期报表序列化导致大量大对象生成,通过改用堆外内存进行序列化输出,最终解决了频繁 Old GC 问题。
469 0
|
12月前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
306 1