虽然称PriorityQueue为队列,但是其实它和队列关系并没有太大,称它为小顶堆更合适。因为其中的数据都会按完全二叉树进行小顶堆构造,当插入新数据的时候会自动将数据插入到合适的位置来保证是一个小顶堆。
注意,队列中的数据不一定有序,但是每次弹出来的一定是最小(最大)的值。
它的常用方法如下:
- add:插入队尾元素,不成功会抛出异常
- offer:插入队尾元素,不能被立即执行的情况下会返回true 或 false
- remove:删除队头元素,如果不成功会返回false。
- remove(Object o):删除其中一个元素o,如果o有多个则只删除一个。
- poll:删除队头元素,并返回删除的元素
- peek:查询队顶元素
- indexOf(Object o):查询对象o的索引
- contain(Object o):判断是否容纳了元素
如果要修改它默认的升序方法可以在构造时用比较器。
以上参考代码如下
import java.util.Comparator;
import java.util.PriorityQueue;
class test {
public static void main(String[] args){
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 从大到小排序
}
});
pq.add(2);
pq.add(2);
pq.add(5);
pq.add(6);
pq.add(3);
if (pq.contains(2)){
System.out.println("yes");
}
pq.offer(4);
pq.remove(2);
pq.remove(5);
System.out.println(pq.poll());
System.out.println(pq.poll());
System.out.println(pq.poll());
System.out.println("end");
}
}