PriorityQueue
java.util.PriorityQueue<E>
- 优先队列,优先级高的元素先出列
- JDK使用二叉堆使得每次出队的元素总是队列里面最小的,元素的大小比较方法可以由用户指定,相当于自定义优先级
- PriorityQueue默认是一个小顶堆,可以通过传入自定义的比较函数来实现大顶堆
1. Comparator 构造方法传参
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
2. 实现 Comparable 接口
class ListNode implements Comparable<ListNode>{
int val;
ListNode next;
ListNode() {
}
ListNode(int val){
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val; this.next = next;
}
@Override
public int compareTo(ListNode node){
return node.val - this.val;
}
}
Queue<ListNode> queue = new PriorityQueue<ListNode>();
4. 覆写`Comparator`的`compare()`方法,此时可通过PriorityQueue的构造方法传入Comparator
public PriorityQueue(Comparator<? super E> comparator) {
this(DEFAULT_INITIAL_CAPACITY, comparator);
}
5. 覆写`Comparable`的`compareTo()`方法,此时PriorityQueue的元素要实现Comparable接口
底层相关
$ public class PriorityQueue<E> extends AbstractQueue<E>
implements java.io.Serializable {
...}
$ public abstract class AbstractQueue<E>
extends AbstractCollection<E>
implements Queue<E> {
...}
$ public abstract class AbstractCollection<E> implements Collection<E> {
...}
$ public interface Queue<E> extends Collection<E> {
..