Queue介绍
Queue介绍
- 每种数据结构会定义一个操作该数据结构的接口(封装)
- PriorityQueue 实现了一个简单的优先队列。
- 开放Comparator 比较器
PriorityQueue 特性
- 首先Queue定义了一系列的操作
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E peek();
一般用于生产者和消费者的一个数据通道(可以采用线程安全的队列)
- Comparator和Comparable的区别。
Comparator(比较器) 的接口方法
int compare(T o1, T o2);
Comparator<T> nullsLast(Comparator<? super T> comparator)
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。
会有多种方法用于2个数据的比较和提供了各种的比较方式和默认的比较器
Comparable的接口方法
public int compareTo(T o);
只有一个接口
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
3.扩展
PriorityQueue实现取最新的TOP n的场景
// 自定义的比较器,可以让我们自由定义比较的顺序 Comparator<Integer> cmp;
cmp = new Comparator<Integer>() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
Queue<Integer> q2 = new PriorityQueue<Integer>(5, cmp);
q2.add(2);
q2.add(8);
q2.add(9);
q2.add(1);
while (!q2.isEmpty()) {
System.out.print(q2.poll() + ",");
}
会提供一个比较器来判断你需要淘汰的数据内容,源码解读
private void siftUpUsingComparator(int k, E x) {
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (comparator.compare(x, (E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = x;
}
在你的add方法中如果当前size等于max则开始筛选siftUpUsingComparator