以前的博客中介绍过队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,此时出队列时需要优先级高的元素先出队列,这个时候传统的队列显然不能胜任,Java中有一个新的实现类继承了Queue接口,这个类实现了上述优先级队列——PriorityQueue。
PriorityQueue是怎么知道队列中哪个元素优先哪个元素不优先的呢?Java中的Comparable和Comparator到底该怎么用看完就全明白了大家可以看一下我这篇文章(不看不影响,看理解的更深刻)有两个路子:
- 队列中对象的实现类必须实现Comparable接口,重写了comparaTo()方法,PriorityQueue会根据ComparaTo()的返回值来找到优先级高的元素并把它放在队首。
- 专门为队列中元素写一个实现了Comparator接口的比较器,在创建优先级队列的时候把比较器对象作为参数传进去:
想具体了解Comparable和Comparator还请看上面那篇博客,这篇博客主要介绍PriorityQueue,总之优先级队列想要得到优先级高的元素就必须要对队列中的元素进行比较,可问题比较依据是什么?这个问题上面两个路子就给解决了,PriorityQueue会好了,聊到现在PriorityQueue可以选出队列中优先级高的元素了。
PriorityQueue的常用构造方法:
PriorityQueue常用方法:
下面具体通过Integer(它实现了Comparable,所以有比较能力,PriorityQueue能选出优先级高的元素)演示一下:
public class Main {
public static void main(String[] args) {
Queue<Integer> queue = new PriorityQueue<>();
//入队列
queue.add(1);
queue.add(999);
queue.add(45);
queue.add(3);
queue.add(66);
//看看队首元素
System.out.println("对首元素" + queue.element());
//出队列
queue.remove();
//看看对首元素、
System.out.println("对首元素" + queue.element());
//查看队列是否为空
System.out.println(queue.isEmpty());
//输出当前队列大小
System.out.println(queue.size());
}
}
运行结果: