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