概念
在了解PriorityQueue之前我们首先套清楚什么是Queue。
- 队列(queue)与栈类似,是一种线性表。遵循“先进先出”(First In First Out) 的原则.
- 即像排队一样刚来的人在队尾(rear)入队(push),而出队(pop)的人都是在队首(front)
但是有时候我们需要在队列中基于优先级来处理对象。比如在分座位时老师会让同学按照高低个子排队,先分矮个子的同学
- 而PriorityQueue就是一个基于优先级的无界优先队列。
- 即队列中元素入队后会根据我们指定的Comparator规则排队或者默认最小元素。
- 除此之外PriorityQueue是一个无界队列,但是初始的容量会随着向队列中添加元素而不断扩容。
基本使用
PriorityQueue与普通的队列的使用方法一致,但是PriorityQueue会根据排序规则判断谁在队首谁在队尾。
默认排序规则
例如:
根据打印情况可以看出:PriorityQueue默认采用从小到大的排序规则。
自定义排序规则
有两种方式:
- 添加元素自身实现了Comparable接口,确保元素是可排序的状态
- 如果添加元素没有实现Comparable接口,可以在创建PriorityQueue队列时直接指定比较器,如下:
这里是创建队列时指定了比较器,然后内部类重写compare方法中写出自定义排序的逻辑。如图是按照填入数字的绝对值来排序。
小结
- PriorityQueue是可以实现自定义的逻辑排序的队列
- 但是深入源码会发现他的offer/poll方法并没有对队列锁定,所以并不是一个线程安全的队列。如果想实现线程安全,需要额外加锁
- 同时也要求他存储的元素必须是可以比较的队形,不是的话必须指定比较器。