优先级队列(PriorityQueue)
- 1. PriorityQueue的特性
- 2. PriorityQueue常用方法介绍
-
1. PriorityQueue的特性
- 使用时必须导入PriorityQueue所在的包,即
import java.util.PriorityQueue;
- PriorityQueue中所放置的元素必须能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常(类型转换异常)
- 不能插入null对象,否则会抛出NullPointerException异常(空指针异常)
- 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
- 插入元素和删除元素的时间复杂度都是O(log2N)
- PriorityQueue底层是使用堆这种数据结构
- PriorityQueue默认情况下是小根堆,即每次获取到的元素都是最小的元素
2. PriorityQueue常用方法介绍
常用构造方法
- 第一个是无参的构造方法
- 第二个构造方法是创建一个初始容量为形参的优先级队列,注意:传过去的形参不能小于1,否则会抛出IllegalArgumentException异常。一般在创建优先级队列对象时,如果知道元素个数,建议直接将底层容量给好,如果后续需要扩容时,需要开辟更大的空间,拷贝元素,这样效率会比较低
- 第三个构造方法是传比较器,设置该优先级队列底层是建大根堆还是小根堆,默认是建小根堆;另外,建堆的元素是一个个对象时,需要传比较器
- 第四个构造方法是既设置了优先级队列的初始容量,又传了比较器
- 第五个构造方法是用一个集合来创建优先级队列
public class Test {public static void main(String[] args) {PriorityQueue<Integer> q1 = new PriorityQueue<>();PriorityQueue<Integer> q2 = new PriorityQueue<>(100);ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);PriorityQueue<Integer> q3 = new PriorityQueue<>(list);}
}
常用的普通方法
- boolean offer(E e)
插入元素e - E peek()
获取优先级最高的元素,若优先级队列为空,则返回null - E poll()
移除优先级最高的元素,如果优先级队列为空,则返回null - int size()
获取有效元素的个数 - void clear()
清空优先级队列 - boolean isEmpty()
判断优先级队列是否为空,为空则返回true