小根堆
import java.util.PriorityQueue;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//小根堆
从源码上看PriorityQueue的入列操作并没对所有加入的元素进行优先级排序。仅仅保证数组第一个元素是最小的即可。下面一个例子,入队顺序是4 6 3 9,然后遍历整个优先队列,发现输出为3 6 4 9。
因此,优先队列是保证队头的元素是当前队列的最小元素,其余的元素并没有排序。
import java.util.Iterator;
import java.util.PriorityQueue;
public class test {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//小根堆
priorityQueue.add(4);
priorityQueue.add(6);
priorityQueue.add(3);
priorityQueue.add(9);
while(!priorityQueue.isEmpty()) {
System.out.println("***遍历队列***");
Iterator<Integer> iterator = priorityQueue.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("***队头元素:"+priorityQueue.poll()+" ,出队列***");
}
}
}
输出
***遍历队列***
3
6
4
9
***队头元素:3 ,出队列***
***遍历队列***
4
6
9
***队头元素:4 ,出队列***
***遍历队列***
6
9
***队头元素:6 ,出队列***
***遍历队列***
9
***队头元素:9 ,出队列***
大根堆
import java.util.PriorityQueue;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
或者
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1, o2) -> (o2 - o1));