PriorityQueue是队列的一种,它叫做优先队列,该类实现了Queue接口。
之所以叫做优先队列,是因为PriorityQueue实现了Comparator这个比较接口,也就是PriorityQueue内部具有了排序方法,在offer(插入)或poll(弹出)元素的过程中,优先队列中的数据会动态排序(而非显式的调用排序方法,可能初学者会这么认为)。
如果不提供Comparator的话,PriorityQueue会按默认的执行,即按照自然数排列,数字最小的优先权最高,对于字符串来说,则是按照字典序。
优先队列不同于常规的队列,对于常规队列来说,每次从队尾入队,队首出队;而对于优先权队列来说,每次出队则是优先权最高的元素。
下面呢,让我们以一个具体案例来更深入的理解PriorityQueue的用法。
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() { 4 5 @Override 6 public int compare(Integer i, Integer j) { 7 // TODO Auto-generated method stub 8 //注意理解,这里是奇数在左侧,数字大的在左侧 9 int result=i%2-j%2; 10 if(result==0) 11 result=i-j; 12 return result; 13 } 14 }); 15 for(int i=0;i<10;i++) 16 { 17 queue.offer(i); 18 } 19 for(int i=0;i<10;i++) 20 { 21 System.out.println(queue.poll()); 22 } 23 }
上述代码实现了一个比较器,该比较器设置为奇数在偶数的左侧,大数在小数的左侧。故输出结果为:0 2 4 6 8 1 3 5 7 9
如果,把比较器的参数i和j互换一下,那么,亲们,能猜测到结果吗?
参数互换以后,奇数在偶数的右侧,大数在小数的右侧(注意,个人感觉右侧的优先权最高,即右侧即为队首,勿喷~);
public static void main(String[] args) { // TODO Auto-generated method stub Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() { @Override public int compare(Integer j, Integer i) { // TODO Auto-generated method stub int result=i%2-j%2; if(result==0) result=i-j; return result; } }); for(int i=0;i<10;i++) { queue.offer(i); } for(int i=0;i<10;i++) { System.out.println(queue.poll()); } }
打印结果为 9 7 5 3 1 8 6 4 2 0