2026/6/10 13:38:32
网站建设
项目流程
上海php网站开发,平度市建设局网站,wordpress变慢,微信公众号登陆平台1. 基本概念PriorityQueue 是 Java 集合框架中的一个基于优先堆的无界队列。它使用优先顺序#xff08;通常是元素的自然顺序或自定义比较器#xff09;来管理元素#xff0c;而不是标准的 FIFO#xff08;先进先出#xff09;顺序。// 基本创建方式
PriorityQueueInt…1. 基本概念PriorityQueue 是 Java 集合框架中的一个基于优先堆的无界队列。它使用优先顺序通常是元素的自然顺序或自定义比较器来管理元素而不是标准的 FIFO先进先出顺序。// 基本创建方式 PriorityQueueInteger pq new PriorityQueue(); // 最小堆默认 PriorityQueueInteger pqMax new PriorityQueue(Collections.reverseOrder()); // 最大堆2. 核心特性特性说明排序方式元素按优先级排序队头总是优先级最高的元素数据结构基于二叉堆实现默认最小堆线程安全❌不是线程安全的如需线程安全用PriorityBlockingQueuenull元素❌ 不允许插入 null时间复杂度插入/删除O(log n)获取队头O(1)3. 常用操作示例import java.util.PriorityQueue; public class PriorityQueueDemo { public static void main(String[] args) { // 1. 创建最小堆默认 PriorityQueueInteger 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. 创建最大堆 PriorityQueueInteger 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. 自定义对象排序 PriorityQueueStudent studentQueue new PriorityQueue( (s1, s2) - s1.score - s2.score // 按分数升序 ); } } class Student { String name; int score; // 构造方法等... }4. 底层实现原理// 简化版内部结构理解 public class PriorityQueueE { private Object[] queue; // 存储元素的数组二叉堆 private Comparator? super E comparator; // 添加元素时的上浮操作heapify-up // 删除元素时的下沉操作heapify-down }默认最小堆父节点 ≤ 子节点存储结构数组实现的完全二叉树父子节点关系父节点索引(i-1)/2左子节点2*i 1右子节点2*i 25. 典型应用场景// 场景1Top K 问题找出最大的K个元素 public ListInteger topK(int[] nums, int k) { PriorityQueueInteger 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) { PriorityQueueListNode pq new PriorityQueue( (a, b) - a.val - b.val ); // 将每个链表的头节点加入队列 // 每次弹出最小的加入其下一个节点 } // 场景3任务调度按优先级执行 PriorityQueueTask taskQueue new PriorityQueue( Comparator.comparingInt(Task::getPriority) );6. 注意事项// ⚠️ 注意1遍历时不保证顺序 PriorityQueueInteger pq new PriorityQueue(); pq.add(3); pq.add(1); pq.add(2); System.out.println(pq); // 可能输出 [1, 3, 2] // 只有 poll() 或 peek() 才能看到正确顺序 // ⚠️ 注意2不能插入不可比较对象 // PriorityQueueObject pq new PriorityQueue(); // pq.add(new Object()); // 运行时错误ClassCastException // ✅ 解决方案提供Comparator PriorityQueueMap.EntryString, Integer pq new PriorityQueue( Map.Entry.comparingByValue() );7. 与相关类的比较类排序方式线程安全边界PriorityQueue优先级顺序❌ 不安全无界ArrayDequeFIFO/LIFO❌ 不安全无界LinkedList插入顺序❌ 不安全无界PriorityBlockingQueue优先级顺序✅ 安全无界总结PriorityQueue适合需要动态排序且频繁访问最小/最大元素的场景默认是最小堆可通过 Comparator 改为最大堆或其他排序规则是算法题中解决堆相关问题的常用工具如 Top K、合并K个有序列表等注意其非线程安全特性多线程环境下需要使用PriorityBlockingQueue