1. 为什么需要自定义PriorityQueue排序
PriorityQueue是Java中一个非常实用的数据结构,它本质上是一个优先级队列,底层实现基于堆。默认情况下,PriorityQueue会按照元素的自然顺序进行排序(最小堆),但实际开发中我们经常需要根据业务需求自定义排序规则。
我最近在开发一个任务调度系统时就遇到了这个问题。系统中的任务对象包含多个属性:优先级权重(priority)、创建时间(createTime)、任务类型(taskType)等。简单的整数排序根本无法满足需求,必须根据这些属性组合出复杂的排序逻辑。比如:
- 高优先级任务先执行
- 相同优先级时,先创建的任务先执行
- 特殊类型的任务需要插队处理
这时候就需要重写Comparator接口的compare方法。下面我会分享三种实现方式,都是我在实际项目中验证过的写法,各有适用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 独立Comparator类实现
2.1 基本实现方式
这是最传统也最直观的写法,适合排序逻辑复杂且需要复用的场景。我们创建一个实现了Comparator接口的独立类:
java复制public class TaskComparator implements Comparator<Task> {
@Override
public int compare(Task t1, Task t2) {
// 首先比较优先级
int priorityCompare = Integer.compare(t2.getPriority(), t1.getPriority());
if (priorityCompare != 0) {
return priorityCompare;
}
// 优先级相同则比较创建时间
return t1.getCreateTime().compareTo(t2.getCreateTime());
}
}
使用时只需要在创建PriorityQueue时传入这个比较器:
java复制PriorityQueue<Task> queue = new PriorityQueue<>(ne
