📅  最后修改于: 2023-12-03 15:31:55.137000             🧑  作者: Mango
Java中的PriorityBlockingQueue是一种特殊类型的队列,它可以根据比较器对元素进行排序。PriorityBlockingQueue允许我们使用自定义的比较器对元素进行排序,这使得我们可以针对具体应用场景定制队列的行为。
PriorityBlockingQueue是一个无界队列,它基于堆排序算法实现。队列中的元素都必须实现Comparable接口或是在构造时指定Comparator比较器,否则在插入元素时会报ClassCastException异常。
PriorityBlockingQueue插入一个元素的时间复杂度为O(log(N)),N是队列的大小。队列中的元素保证是有序的,如果两个元素a和b,a.compareTo(b)为负数,则a排在b的前面。
PriorityBlockingQueue在多线程环境中使用时是线程安全的,在多线程环境中同时使用add()和take()可以提供阻塞队列的特性。
PriorityBlockingQueue的比较器是通过构造函数指定的,也可以使用默认的比较器。对于自定义的比较器,有两种实现方式:
实现Comparable接口意味着元素本身就有一种排序规则,如果没有特殊需求,可以使用这种方式。
public class User implements Comparable<User> {
private String name;
private Integer age;
@Override
public int compareTo(User o) {
return this.age - o.age;
}
// getter和setter方法
}
在这个例子中,我们想按年龄从小到大排列User对象,因此我们实现了compareTo方法,该方法返回整数值,指定了User对象的排序规则。
实现Comparator接口意味着可以定义多种排序规则,可以根据具体场景选择性地使用。
public class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge();
}
}
这个例子中,我们想按年龄从小到大对User对象进行排序。因此我们实现了compare方法,并将其传递给PriorityBlockingQueue的构造函数。
PriorityBlockingQueue<User> queue = new PriorityBlockingQueue<>(new UserComparator());
这条语句创建了一个PriorityBlockingQueue对象,并使用UserComarator规则进行排序。
一个基于PriorityBlockingQueue实现的TODO任务列表
public class Task implements Comparable<Task> {
private String title;
private int priority;
public Task(String title, int priority) {
this.title = title;
this.priority = priority;
}
@Override
public int compareTo(Task o) {
return this.priority - o.priority;
}
// getter和setter方法
}
public class TODOList {
private PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue<>();
public boolean addTask(Task task) {
return queue.add(task);
}
public Task getNextTask() {
return queue.poll();
}
}
在这个例子中,我们定义了Task对象,并实现了compareTo方法,规定了Task对象的排序规则。Task对象包含任务标题(title)和优先级(priority)属性。
在TODOList类中,我们使用PriorityBlockingQueue作为任务列表,每次增加任务使用addTask方法,获取下一个任务时使用getNextTask方法。
这种实现方式可以根据任务的优先级高低自动进行排序,非常方便实用。
使用PriorityBlockingQueue和比较器可以方便地实现数据结构的排序,并且可以适应不同的场景实现不同的排序规则。由于PriorityBlockingQueue是线程安全的,在多线程环境中使用时非常方便。