news 2026/6/23 15:50:21

java基础-PriorityQueue(优先队列)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java基础-PriorityQueue(优先队列)

1. 基本概念

PriorityQueue 是 Java 集合框架中的一个基于优先堆的无界队列。它使用优先顺序(通常是元素的自然顺序或自定义比较器)来管理元素,而不是标准的 FIFO(先进先出)顺序。

// 基本创建方式 PriorityQueue<Integer> pq = new PriorityQueue<>(); // 最小堆(默认) PriorityQueue<Integer> pqMax = new PriorityQueue<>(Collections.reverseOrder()); // 最大堆

2. 核心特性

特性说明
排序方式元素按优先级排序,队头总是优先级最高的元素
数据结构基于二叉堆实现(默认最小堆)
线程安全不是线程安全的(如需线程安全用PriorityBlockingQueue
null元素❌ 不允许插入 null
时间复杂度插入/删除:O(log n),获取队头:O(1)

3. 常用操作示例

import java.util.PriorityQueue; public class PriorityQueueDemo { public static void main(String[] args) { // 1. 创建最小堆(默认) PriorityQueue<Integer> minHeap = new PriorityQueue<>(); // 添加元素 minHeap.offer(5); minHeap.offer(1); minHeap.offer(3); minHeap.offer(2); System.out.println("最小堆元素顺序:"); while (!minHeap.isEmpty()) { System.out.print(minHeap.poll() + " "); // 输出: 1 2 3 5 } // 2. 创建最大堆 PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a); // 自定义比较器 maxHeap.offer(5); maxHeap.offer(1); maxHeap.offer(3); System.out.println("\n最大堆元素顺序:"); while (!maxHeap.isEmpty()) { System.out.print(maxHeap.poll() + " "); // 输出: 5 3 1 } // 3. 自定义对象排序 PriorityQueue<Student> studentQueue = new PriorityQueue<>( (s1, s2) -> s1.score - s2.score // 按分数升序 ); } } class Student { String name; int score; // 构造方法等... }

4. 底层实现原理

// 简化版内部结构理解 public class PriorityQueue<E> { private Object[] queue; // 存储元素的数组(二叉堆) private Comparator<? super E> comparator; // 添加元素时的上浮操作(heapify-up) // 删除元素时的下沉操作(heapify-down) }
  • 默认最小堆:父节点 ≤ 子节点

  • 存储结构:数组实现的完全二叉树

  • 父子节点关系

    • 父节点索引:(i-1)/2

    • 左子节点:2*i + 1

    • 右子节点:2*i + 2

5. 典型应用场景

// 场景1:Top K 问题(找出最大的K个元素) public List<Integer> topK(int[] nums, int k) { PriorityQueue<Integer> minHeap = new PriorityQueue<>(); for (int num : nums) { minHeap.offer(num); if (minHeap.size() > k) { minHeap.poll(); // 移除最小的,保持K个最大的 } } return new ArrayList<>(minHeap); } // 场景2:合并多个有序列表 public ListNode mergeKLists(ListNode[] lists) { PriorityQueue<ListNode> pq = new PriorityQueue<>( (a, b) -> a.val - b.val ); // 将每个链表的头节点加入队列 // 每次弹出最小的,加入其下一个节点 } // 场景3:任务调度(按优先级执行) PriorityQueue<Task> taskQueue = new PriorityQueue<>( Comparator.comparingInt(Task::getPriority) );

6. 注意事项

// ⚠️ 注意1:遍历时不保证顺序 PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.add(3); pq.add(1); pq.add(2); System.out.println(pq); // 可能输出 [1, 3, 2] // 只有 poll() 或 peek() 才能看到正确顺序 // ⚠️ 注意2:不能插入不可比较对象 // PriorityQueue<Object> pq = new PriorityQueue<>(); // pq.add(new Object()); // 运行时错误:ClassCastException // ✅ 解决方案:提供Comparator PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>( Map.Entry.comparingByValue() );

7. 与相关类的比较

排序方式线程安全边界
PriorityQueue优先级顺序❌ 不安全无界
ArrayDequeFIFO/LIFO❌ 不安全无界
LinkedList插入顺序❌ 不安全无界
PriorityBlockingQueue优先级顺序✅ 安全无界

总结

  • PriorityQueue适合需要动态排序且频繁访问最小/最大元素的场景

  • 默认是最小堆,可通过 Comparator 改为最大堆或其他排序规则

  • 算法题中解决堆相关问题的常用工具(如 Top K、合并K个有序列表等)

  • 注意其非线程安全特性,多线程环境下需要使用PriorityBlockingQueue

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:36:43

Qwen3-14B模型量化压缩技术:降低GPU内存占用

Qwen3-14B模型量化压缩技术&#xff1a;降低GPU内存占用 在企业级AI应用加速落地的今天&#xff0c;一个现实问题日益凸显&#xff1a;如何让高性能大模型跑得动、用得起&#xff1f;以Qwen3-14B为代表的中型语言模型虽具备出色的推理能力&#xff0c;但原始FP16精度下近28GB的…

作者头像 李华
网站建设 2026/6/22 23:06:21

18、日期和时间的格式化、解析及时间区域的使用

日期和时间的格式化、解析及时间区域的使用 1. 日期和时间的格式化与解析 1.1 不同地区的日期格式差异 日期的格式会因地区而异。例如,2002 年 5 月 9 日,在美国英语(en - US)地区的短格式为 5/9/02,而在法国法语(fr - FR)地区则为 09/05/02。 1.2 JSTL 的日期格式化…

作者头像 李华
网站建设 2026/6/23 19:17:53

VisionPro CogIPOneImageTool1 工具超详细解释(含内部功能全解析)

CogIPOneImageTool1 工具一、工具基本定位CogIPOneImageTool1 是康耐视 (Cognex) VisionPro 视觉软件中的单图像基础图像处理工具&#xff0c;专注于对单张输入图像执行像素级的预处理操作&#xff08;如亮度调整、滤波降噪、形态学处理、几何变换等&#xff09;。它是 VisionP…

作者头像 李华
网站建设 2026/6/23 2:22:16

VisionPro CogIDTool 工具超深度详解(技术细节 + 实战配置版)

CogIDTool 工具超深度详解一、工具基本定位&#xff1a;工业条码识读的 “全能型工具”CogIDTool1 是康耐视 (Cognex) VisionPro 中专注于多码制条码 / 二维码识读的专业工具&#xff0c;区别于 VisionPro 中简单的CogBarcodeTool&#xff08;仅支持基础一维码&#xff09;&…

作者头像 李华
网站建设 2026/6/23 19:10:22

让 BI 拥有‘领域大脑’:智能 BI 如何实现 AI 级精准数据查询

随着 AI 广泛应用&#xff0c;企业用户期待商业智能 BI 系统也能实现 AI 式数据查询。业务人员可以在 BI 系统中输入自然语言&#xff0c;比如“我要查今年广东省客户的空调订单金额”&#xff0c;就能得到想要的结果&#xff0c;效率一定会大幅提升&#xff01; 实现 AI 式自…

作者头像 李华
网站建设 2026/6/23 19:09:00

提示工程架构师的战略规划:提示系统生命周期管理

提示工程架构师的战略规划&#xff1a;提示系统生命周期管理——从“零散提示”到“系统能力”的蜕变 一、引入&#xff1a;当提示工程遇到“成长的烦恼” 凌晨2点&#xff0c;某电商公司的算法工程师小李还在电脑前改提示词。上周刚上线的“智能客服提示模板”出了问题——用户…

作者头像 李华