Java优先级队列(Priority Queue)?

注意:这里的优先级队列不是数据结构中的概念,而是java中的集合类。

注意:建议先把我博客里的堆,比较器这两篇文章看一哈


优先级队列的定义

  • 优先级队列是逻辑结构是小根堆,存储结构是动态数组(到达上限,容量自动加一)的集合类。

优先级队列的特点

  • 优先级队列里的元素必须有优先级!!!优先级是前后排序的“规则”,也就是说插入队列的类必须实现内部比较器或拥有外部比较器(在构造函数中当参数)!!!!
  • 优先级队列的拥有小根堆的所有特性。
  • 优先级队列不是线程安全的。
  • 优先级队列不允许使用null元素。
  • 优先级队列本身并一个有序(从a[0]-a[n]全部升序)序列,只有当你把元素一个个取出的时候,这些取出的元素所排成的序列才是有序序列。原因很简单,优先级队列是一个小根堆,也就是只能保证根节点(a[0])是最小的,其余元素的顺序不能保证(当然,其他元素必须遵守小根堆的特性),当我们取出元素(poll)时,我们只能取出根节点的元素,然后把堆的最后一个元素剪切到根节点(这种取出方式是底层算法规定的,充分利用了堆的特性),然后对所有剩余元素进行建堆,建堆之后根节点元素还是最小的(初始堆中的第二小)。由此特点,我们可以引出另外两个知识点:①优先级队列的迭代器遍历出来的数组是没有排序的,只是个小根堆。②如果我们想得到有序的堆,需要把堆先转为数组,然后arrays.sort(queue.toarray),arrays.sort(queue.toarray,comparator对象)或者其他sort方法。
  • 优先级队列(堆)中的插入就只能插到最后,也就是说添加和插入一个意思;删除也只能删第一个。
  • 注:每个元素的优先级根据问题的要求而定。当从优先级队列中取出一个元素后,可能出现多个元素具有相同的优先权。在这种情况下,把这些具有相同优先权的元素视为一个先来先服务的队列,按他们的入队顺序进行先后处理。

常用方法:

添加(插入):

public boolean add(E e)

查看(只返回根节点元素,不删除):

public E peek()

取出(返回根节点元素,会删除源数据):

public E poll()

删除(如果有多个相同元素,只会删除第一个):

public boolean remove(Object o)

还有就是一些collection类通有的方法,不多说了

记住!!!所有会破坏堆的特性的方法(比如插入删除等)的源码里最后都会加一个建堆方法(siftUp(i, e),也可以说交换方法,调整方法),使队列保持堆的特性


感谢几位大佬,想了解更多源码,例子,实例图的可以去看看:

https://www.cnblogs.com/demingblog/p/6485193.html

https://www.cnblogs.com/CarpenterLee/p/5488070.html

https://blog.csdn.net/u013309870/article/details/71189189

https://blog.csdn.net/cainv89/article/details/51588920

你可能感兴趣的:(集合框架)