在线工具站
- 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
- 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。
小报童专栏精选Top100
- 推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~
在 Java 的集合框架中,PriorityQueue
是一个重要的类,用于实现带有优先级的队列。这种数据结构在需要处理有优先级的任务时非常有用,例如调度任务、处理操作系统中的进程调度、或处理优先级队列算法等场景。
1. 什么是 PriorityQueue
?
PriorityQueue
是一个特殊类型的队列,它与普通的 FIFO(先进先出)队列不同,PriorityQueue
中的元素具有优先级。每次访问队列时,总是优先处理优先级最高的元素,而不是最早添加的元素。
Java 中的 PriorityQueue
实现了 Queue
接口,是一个基于优先级堆(通常是最小堆)的无界队列。这意味着队列中元素的优先级是通过自然顺序(或通过指定的比较器)来决定的。队列中的头部元素总是优先级最高的那个。
2. PriorityQueue
的基本特性
2.1 内部结构
PriorityQueue
的内部实现基于堆结构。堆是一种特殊的二叉树,它满足以下条件:
- 对于最小堆,父节点的值总是小于或等于其子节点的值。
- 对于最大堆,父节点的值总是大于或等于其子节点的值。
Java 中的 PriorityQueue
默认是最小堆,即队列头部元素是优先级最低的元素。
2.2 非线程安全
PriorityQueue
是非线程安全的。这意味着在并发环境中,如果多个线程同时访问和修改 PriorityQueue
,则需要手动同步。
2.3 排序规则
PriorityQueue
中的元素可以通过自然顺序(即实现 Comparable
接口的顺序)或通过自定义的比较器来决定优先级顺序。
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(10);
pq.add(20);
pq.add(15);
System.out.println(pq.poll()); // 输出 10
在上面的例子中,PriorityQueue
使用自然顺序进行排序,因此最小的数字 10
被优先处理。
3. 如何使用 PriorityQueue
?
3.1 构造方法
PriorityQueue
提供了多个构造方法,允许根据需求来创建队列:
PriorityQueue()
:创建一个初始容量为 11 的空优先队列,使用自然排序。PriorityQueue(int initialCapacity)
:创建一个具有指定初始容量的空优先队列,使用自然排序。PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
:创建一个具有指定初始容量和自定义比较器的空优先队列。PriorityQueue(Collection<? extends E> c)
:创建一个基于指定集合的优先队列