You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
## 一、基础
|
|
|
|
|
基于堆实现的优先队列,堆是由数组实现的完全二叉树。是最小堆的实现,在最小堆中,_父节点的值比每一个子节点的值都要小_。从源码可以看出使用Object[]数组实现,并且默认容量为11。
|
|
|
|
|
![[Snipaste_2023-02-09_10-26-31.png]]
|
|
|
|
|
|
|
|
|
|
从构造函数可以看出,可以传入自定义比较器,如果使用默认比较器则是自然顺序或字典序
|
|
|
|
|
![[Snipaste_2023-02-09_10-30-20.png]]
|
|
|
|
|
|
|
|
|
|
其中的方法:
|
|
|
|
|
+ boolean add(object):将指定的元素插入此优先级队列。
|
|
|
|
|
+ boolean offer(object):将指定的元素插入此优先级队列。
|
|
|
|
|
+ boolean remove(object):从此队列中删除指定元素的单个实例(如果存在)。
|
|
|
|
|
+ Object poll():检索并删除此队列的头部,如果此队列为空,则返回null。
|
|
|
|
|
+ Object element():检索但不删除此队列的头部,如果此队列为空,则返回null。
|
|
|
|
|
+ Object peek():检索但不删除此队列的头部,如果此队列为空,则返回null。
|
|
|
|
|
+ void clear():从此优先级队列中删除所有元素。
|
|
|
|
|
+ Comparator comparator():返回用于对此队列中的元素进行排序的比较器,如果此队列根据其元素的自然顺序排序,则返回null。
|
|
|
|
|
+ boolean contains(Object o):如果此队列包含指定的元素,则返回true。
|
|
|
|
|
+ Iterator iterator():返回此队列中元素的迭代器。
|
|
|
|
|
+ int size():返回此队列中的元素数。
|
|
|
|
|
+ Object [] toArray():返回包含此队列中所有元素的数组。
|
|
|
|
|
|
|
|
|
|
## 二、特点
|
|
|
|
|
|
|
|
|
|
- PriorityQueue是一个无限制的队列,并且动态增长(数组自动扩50%或两倍容量)。默认初始容量`'11'`可以使用相应构造函数中的**initialCapacity**参数覆盖。
|
|
|
|
|
- 它不允许NULL对象。
|
|
|
|
|
- 添加到PriorityQueue的对象必须具有可比性。
|
|
|
|
|
- **默认情况下,**优先级队列的对象**按自然顺序排序**。
|
|
|
|
|
- 比较器可用于队列中对象的自定义排序。
|
|
|
|
|
- 优先级队列的**头部**是基于自然排序或基于比较器的排序的**最小**元素。当我们轮询队列时,它从队列中返回头对象。
|
|
|
|
|
- 如果存在多个具有相同优先级的对象,则它可以随机轮询其中任何一个。
|
|
|
|
|
- PriorityQueue **不是线程安全的**。`PriorityBlockingQueue`在并发环境中使用。
|
|
|
|
|
- 它为add和poll方法提供了**O(log(n))**时间。
|