PriorityQueue的排序规则

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。