PriorityQueue默认是自然排序,但是如果使用了比较器,那么底层会维护一个大顶堆/小顶堆,所有的插入操作都会按照大顶堆或者小顶堆的规则去维护。
这里先用一个栗子来帮助理解,后续补上源码…
public static void main(String[] args) {
//小顶堆
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((o1,o2)->o1.compareTo(o2));
pq.add(3);
pq.add(1);
pq.add(2);
pq.add(4);
for(Integer t:pq){
System.out.print(t+" ");
}
System.out.println();
while(pq.size()!=0){
System.out.print(pq.remove()+" ");
}
System.out.println();
PriorityQueue<String> ppq = new PriorityQueue<String>((o1,o2)->o1.compareTo(o2));
// 入队只做简单的选择排序,和队头的数据进行比较,a加入后和a比较,abcd>a所以放在a的右边
ppq.add("aaaa");
ppq.add("cccc");
ppq.add("a");
ppq.add("abcd");
for(String t:ppq){
System.out.print(t+" ");
}
System.out.println();
//出队会进行每次队头排序完成排序
while(ppq.size()!=0){
System.out.print(ppq.remove()+" ");
}
System.out.println();
}
运算结果:
1 3 2 4
1 2 3 4
a abcd aaaa cccc
a aaaa abcd cccc
PriorityQueue中的add()和offer()
add(E e)和offer(E e)的语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后则则会返回false。