## 一、基础 基于堆实现的优先队列,堆是由数组实现的完全二叉树。是最小堆的实现,在最小堆中,_父节点的值比每一个子节点的值都要小_。从源码可以看出使用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))**时间。