JAVA环境
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b18, mixed mode)
依赖版本
Apache Commons Collections 依赖版本:commons-collections4 : 4.0
检查依赖配置
确认项目中是否正确引入了 Apache Commons Collections 的依赖。如果使用的是 Maven,可以在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
资源下载
前置知识
PriorityQueue - kick-off
java.util.PriorityQueue
优先级队列是基于优先级堆(a priority heap)的一种特殊队列,他给每个元素定义“优先级”,这样取出数据的时候会按照优先级来取。默认情况下,优先级队列会根据自然顺序对元素进行排序(基于Comparable 接口)。
因此,放入PriorityQueue的元素,需要实现 Comparable 接口,PriorityQueue 会根据元素的排序顺序决定出队的优先级。
如果没有实现 Comparable 接口,PriorityQueue 还允许我们提供一个自定义排序的对象 (基于Comparator接口) 来判断两个元素的顺序。
readObject
PriorityQueue 支持反序列化,在重写的 readObject 方法中,将数据反序列化到 queue 中之后,会调用 heapify()
方法来对数据进行排序。
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in (and discard) array length
s.readInt();
queue = new Object[size];
// Read in all elements.
for (int i = 0; i < size; i++)
queue[i] = s.readObject();
// Elements are guaranteed to be in "proper order", but the
// spec has never explained what that might be.
heapify();
}
heapify
heapify()
方法调用 siftDown()
方法
private void heapify() {
for (int i = (size >>> 1) - 1; i >= 0; i--)
siftDown(i, (E) queue[i]);
}
siftDown()
siftDown()
方法在 comparator 属性不为空的情况下,调用 siftDownUsingComparator()
方法
private void siftDown(int k, E x) {
if (comparator != null)
siftDownUsingComparator(k, x);
else
siftDownComparable(k, x);
}
siftDownUsingComparator
在 siftDownUsingComparator()
方法中,会调用 comparator 的 compare()
方法来进行优先级的比较和排序。
private void siftDownUsingComparator(int k, E x) {
int half = size >>> 1;
while (k < half) {
int child = (k << 1) + 1;
Object c = queue[child];
int right = child + 1;
if (right < size &&