面试题答案
一键面试import java.util.Comparator;
import java.util.PriorityQueue;
public class PriorityBlockingQueueExample {
public static void main(String[] args) {
// 使用自定义比较器定义和初始化PriorityBlockingQueue
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 这里实现按优先级比较,例如o1 > o2时返回1,表示o1优先级低
return o1 > o2? 1 : (o1 < o2? -1 : 0);
}
});
// 添加任务
priorityQueue.add(3);
priorityQueue.add(1);
priorityQueue.add(2);
// 处理任务,会按优先级顺序处理
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll());
}
}
}
比较器(Comparator)的作用:
- 在
PriorityBlockingQueue
中,比较器用于定义元素之间的优先级顺序。通过实现Comparator
接口中的compare
方法,我们可以自定义如何比较两个元素,以确定哪个元素具有更高的优先级。例如在上述代码中,compare
方法定义了一种优先级规则,使得数值小的元素优先级更高。
如果不使用比较器:
- 如果不提供自定义比较器,且元素类型没有实现
Comparable
接口,那么在向PriorityBlockingQueue
添加元素时会抛出ClassCastException
。因为队列需要一种方式来确定元素的顺序,如果没有比较器也没有自然排序(Comparable
),就无法进行优先级的判定。 - 如果元素类型实现了
Comparable
接口,那么队列会按照元素的自然顺序来确定优先级。例如Integer
类型默认是按数值从小到大排序,此时PriorityBlockingQueue
会按此自然顺序处理元素的优先级。