-
由于优先级队列其实就是一个堆,所以在了解优先级队列之前,要确保有堆的概念
大根堆:是一个完全二叉树,父节点的值大于或等于子节点的值
小根堆:是一个完全二叉树,父节点的值小于或等于子节点的值
-
优先级队列在不指定Comparator的时候,就是一个小根堆,可以根据元素的自然顺序来排列,也可以根据Comparator来设置排序规则
-
优先级队列特点:
-
队列是用数组实现,但是数组大小可以动态增加,容量无限。
-
不是线程安全的。保证线程安全可以使用PriorityBlockingQueue 类。
-
不允许使用 null 元素。
-
可以在构造函数中指定如何排序。
-
操作基本同正常队列相同
-
-
设置小根堆:
//lamda表达式 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(((o1, o2) -> o1 - o2)); //比较器 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 -o2; } });
复合形式也可以设置
PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(((o1, o2) -> o1.getValue() - o2.getValue()));
-
设置大根堆
//lamda表达式 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(((o1, o2) -> o2 - o1)); //比较器 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 -o1; } });
复合形式也可以设置
PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(((o1, o2) -> o2.getValue() - o1.getValue()));
-
注:优先队列中存放的元素,要么是有自然排序,即数字等,否则必须实现比较器,给它一个排序规则,不然会报运行时异常ClassCastExcepion