优先队列
在 Java 中,优先队列(PriorityQueue) 是一个基于堆(通常是最小堆)的数据结构,位于 java.util 包中。优先队列的元素会按照自然顺序或提供的比较器顺序进行排序。以下是关于优先队列的详细介绍:
特点
- 自动排序:默认是最小优先队列(最小堆),即每次取出的元素是当前队列中最小的元素。
- 非线程安全:
PriorityQueue不是线程安全的,如果需要线程安全,可以使用PriorityBlockingQueue。 - 不允许
null元素。 - 支持自定义顺序:可以通过传入
Comparator定义元素的排序方式。
构造方法
PriorityQueue 提供多种构造方法:
-
默认构造方法:
1
PriorityQueue<E> pq = new PriorityQueue<>();
创建一个初始容量为 11 的最小堆。
-
指定初始容量:
1
PriorityQueue<E> pq = new PriorityQueue<>(int initialCapacity);
-
指定比较器:
1
PriorityQueue<E> pq = new PriorityQueue<>(Comparator<? super E> comparator);
创建一个使用自定义比较器的优先队列。
-
通过集合初始化:
1
PriorityQueue<E> pq = new PriorityQueue<>(Collection<? extends E> c);
常用方法
以下是 PriorityQueue 的常用方法:
| 方法名 | 说明 |
|---|---|
add(E e) |
向队列中添加元素,若超出容量会抛出异常。 |
offer(E e) |
向队列中添加元素,推荐使用。 |
poll() |
移除并返回队列的头部元素,若队列为空则返回 null。 |
peek() |
返回队列的头部元素但不移除,若队列为空则返回 null。 |
remove(Object o) |
删除队列中指定的元素。 |
size() |
返回队列中元素的数量。 |
isEmpty() |
判断队列是否为空。 |
clear() |
清空队列中的所有元素。 |