8.5.1 PriorityQueue实现类
PriorityQueue
是一个比较标准的队列实现类。之所以说它是比较标准的队列实现,而不是绝对标准的队列实现,是因为PriorityQueue
保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek()
方法或者poll()
方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。从这个意义上来看, PriorityQueue
已经违反了队列的最基本规则:先进先出(FIFO)
。下面程序示范了PriorityQueue
队列的用法。
1 | import java.util.*; |
运行效果:
1 | [-3, 6, 20, 18] |
运行上面程序直接输出PriorityQueue
集合时,可能看到该队列里的元素并没有很好地按大小进行排序,但这只是受到PriorityQueue
的toString
方法的返回值的影响。实际上,程序多次调用PriorityQueue
集合对象的poll()
方法时,可看到元素按从小到大的顺序”移出队列”.PriorityQueue
不允许插入null
元素,它还需要对队列元素进行排序, PriorityQueue
的元素有两种排序方式:
- 自然排序:采用自然排序的
PriorityQueue
集合中的元素必须实现了Comparable
接口,而且存放的应该是同一个类的多个实例,否则可能导致ClassCastException
异常。 - 定制排序:创建
PriorityQueue
队列时,传入一个Comparator
对象,该对象负责对队列中的所有元素进行排序。采用定制排序时不要求队列元素实现Comparable
接口。
PriorityQueue
队列对元素的要求与TreeSet
对元素的要求基本一致,因此关于使用自然排序和定制排序的详细介绍请参考8.3.3节。
原文链接: 8.5.1 PriorityQueue实现类