什么是优先队列
Queue普通队列:队列元素按照先进先出规则,示例如下
入队顺序:a,b,c,d
出队顺序:a,b,c,d
PriorityQueue优先队列:为每个入队元素设定一个优先级,按优先级顺序出队,示例如下,括号内为优先级
入队顺序:a(3),b(1),c(2)
出队顺序:b(1),c(2),a(3)
java中优先队列的实现类是PriorityQueue,默认情况下,优先级由对象的自然顺序决定。队列构建时提供的比较器可以覆盖默认优先级。关于Comparable和Comparator的使用可以参考 Java中Comparable接口与Comparator接口的详解与使用
java中自定义优先级的实现
1.Comparable接口:元素实现Camparable接口,重写接口中的compareTo函数,按照函数中的规则进行比较
2.Comparator接口:按照外部比较器的规则来决定元素优先级
PriorityQueue构造方法
PriorityQueue() :使用默认的容量11创建一个优先队列,元素的顺序规则是自然顺序
PriorityQueue(int initialCapacity): 使用自定义容量initialCapacity创建一个优先队列,元素的顺序规则是自然顺序
initialCapacity(Comparator<?super E> comparator) : 使用默认的容量11创建一个优先队列,元素的顺序规则是comparator
自定义优先级代码演示
定义Animal类实现Comparable接口,compareTo方法中自定义优先级规则为按照age从小到大顺序
public class Animal implements Comparable<Animal>{
String name;
int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal{name = " + name + ", age = " + age + "}";
}
@Override
public int compareTo(Animal o) {
return this.age - o.age; //优先级按照age从小到大
}
}
public class Test {
public static void main(String[] args) {
PriorityQueue<Animal> pq = new PriorityQueue<>();
pq.add(new Animal("毛毛",2));
pq.add(new Animal("豆子",5));
pq.add(new Animal("图图",1));
System.out.println(pq.poll());
System.out.println(pq.poll());
System.out.println(pq.poll());
}
}
运行结果可知,队列中的元素按age从小到大顺序出队,与入队顺序无关
Animal{name = 图图, age = 1}
Animal{name = 毛毛, age = 2}
Animal{name = 豆子, age = 5}