Java——优先队列(一文搞懂优先队列的理论和实践)

1. 功能

  • PriorityQueue 是一个无限制的队列,并且动态增长。默认初始容量'11'可以使用相应构造函数中的 initialCapacity 参数覆盖。
  • 它不允许NULL对象。
  • 添加到 PriorityQueue 的对象必须具有可比性。
  • 默认情况下,优先级队列的对象按自然顺序排序。
  • 比较器可用于队列中对象的自定义排序。
  • 优先级队列的头部是基于自然排序或基于比较器的排序的最小元素。当我们轮询队列时,它从队列中返回头对象。
  • 如果存在多个具有相同优先级的对象,则它可以随机轮询其中任何一个。
  • PriorityQueue 不是线程安全的PriorityBlockingQueue在并发环境中使用。
  • 它为addpoll方法提供了O(log(n))时间。

2. 构造函数

  • PriorityQueue():使用默认初始容量(11)构造空队列,该容量根据其自然顺序对其元素进行排序。
  • PriorityQueue(Collection c):构造包含指定集合中元素的空队列。
  • PriorityQueue(int initialCapacity):构造具有指定初始容量的空队列,该容量根据其自然顺序对其元素进行排序。
  • PriorityQueue(int initialCapacity,Comparator comparator):构造具有指定初始容量的空队列,该容量根据指定的比较器对其元素进行排序。
  • PriorityQueue(PriorityQueue c):构造包含指定优先级队列中元素的空队列。
  • PriorityQueue(SortedSet c):构造包含指定有序集合中元素的空队列。

3. 优先队列(PriorityQueue)的方法

  • 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():返回包含此队列中所有元素的数组。

4. 使用注意点

  • PriorityQueue 中放置的元素必须要能够比较大小 (只有实现了 ComparableComparator 接口的类才能比较大小),不能插入无法比较大小的对象,否则会抛出 ClassCastException 异常
  • 不能插入 null 对象,否则会抛出 NullPointerException 异常
  • 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
  • 插入和删除元素的时间复杂度均为 O(log2N)
  • PriorityQueue 底层使用了堆数据结构

5、优先队列——自定义排序

public static void main(String[] args) {
  Map<Integer,Integer> map = new HashMap<>();
  //do 自行添加数据到map中,模拟数据
  PriorityQueue<Integer[]> queue = new PriorityQueue<>(map.size(),(e1,e2)->e2[1]-e1[1]);
      map.forEach((k,v)->{
          queue.add(new int[]{k,v});
      });
  // 遍历K次queue.poll(),取出数据即可
}

你可能感兴趣的:(Java,java,算法,数据结构)