目录
一、优先级队列 PriorityQueue
PriorityQueue 类在 Java 1.5 中引入。
- PriorityQueue 是基于优先堆的一个无界队列,是Queue接口的一个队列实现类,但它的排序并不是典型的队列式先进先出(FIFO)的方式。
- PriorityQueue的排序方式分为两种,一种是自然排序,这是按照加入元素的大小从小到大排序的。第二种是定制排序,是使用comparator类来重写compare(Object o1,Object o2)方法来实现定制排序的。但是这些都不是关键,关键在于PriorityQueue的排序不是普通的排序,而是堆排序。
- PriorityQueue 不允许空值,而且不支持 non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用 Java Comparable 和 Comparator 接口给对象排序,并且在排序时会按照优先级处理其中的元素。
- PriorityQueue 的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。
- PriorityQueue 是非线程安全的,所以 Java 提供了 PriorityBlockingQueue(实现 BlockingQueue接口)用于Java 多线程环境。
二、示例:
public static void main(String[] args) {
PriorityQueue<String> priorityQueue = new PriorityQueue();
priorityQueue.offer("b");
priorityQueue.offer("t");
priorityQueue.offer("a");
System.out.println(priorityQueue);//[a, t, b]
}
不是说是按从小到大来排序的吗?怎么没排序?
原因是堆排序只会保证第一个元素也就是根节点的元素是当前优先队列里最小(或者最大)的元素,而且每一次变化之后,比如offer()或者poll()之后,都会进行堆重排,所以如果想要按从小到大的顺序取出元素,那么需要用一个for循环
如下:
public static void main(String[] args) {
PriorityQueue<String> priorityQueue = new PriorityQueue();
priorityQueue.offer("b");
priorityQueue.offer("t");
priorityQueue.offer("a");
int size = priorityQueue.size();//取出.size()大小,因为每一次poll()之后size大小都会变化,所以不能作为for循环的判断条件
while(!priorityQueue.isEmpty()){
System.out.println(priorityQueue.poll());//abt
}
}
三、使用场景
参考:https://www.jianshu.com/p/c577796e537a
参考:Java中PriorityQueue的排序,堆排序_苦咖啡的自留地-CSDN博客_priorityqueue 排序