- 作者:老汪软件技巧
- 发表时间:2024-09-25 17:01
- 浏览量:
PriorityQueue是 Java 集合框架中的一个重要类,它实现了Queue接口,并且是一个基于优先级堆的无界优先级队列。PriorityQueue保证了队列中的元素会按照其自然顺序或者根据构造队列时提供的Comparator进行排序。下面我们来解析PriorityQueue的部分核心源码。
1. 继承与实现
PriorityQueue继承自AbstractQueue类,并实现了java.util.Queue接口。它内部使用了一个数组来存储队列元素,但这个数组并不是普通的数组,而是基于堆(Heap)结构来组织的。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
2. 成员变量3. 构造方法
PriorityQueue提供了多个构造方法,包括无参构造方法、接受初始容量的构造方法、接受初始容量和比较器的构造方法等。例如:
java复制代码
public PriorityQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
public PriorityQueue(int initialCapacity) {
this(initialCapacity, null);
}
public PriorityQueue(int initialCapacity,
Comparator super E> comparator) {
// 省略了部分代码...
this.queue = new Object[initialCapacity];
this.comparator = comparator;
}
4. 插入操作
插入操作主要通过offer(E e)方法实现,其内部调用siftUp方法来保持堆的性质。如果插入的元素破坏了堆的性质,siftUp方法会进行必要的调整。
java复制代码
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
if (i >= queue.length)
grow(i + 1);
size = i + 1;
if (i == 0)
queue[0] = e;
else
siftUp(i, e);
return true;
}
private void siftUp(int k, E x) {
// 省略了部分代码...
}
5. 移除操作
移除操作通常指的是移除并返回队列头部的元素(即优先级最高的元素),这通过poll()方法实现。如果队列为空,则返回null。poll()方法首先移除堆顶元素,然后调用siftDown方法来保持堆的性质。
java复制代码
public E poll() {
if (size == 0)
return null;
int s = --size;
modCount++;
E result = (E) queue[0];
E x = (E) queue[s];
queue[s] = null;
if (s != 0)
siftDown(0, x);
return result;
}
private void siftDown(int k, E x) {
// 省略了部分代码...
}
6. 堆的调整
无论是siftUp还是siftDown方法,都是用来在插入或删除元素后调整堆结构,以保持堆的性质。这两个方法的实现较为复杂,涉及到堆中元素的比较和位置的调整。
7. 总结
PriorityQueue通过内部的数组和堆结构来管理元素,实现了基于优先级的队列操作。其核心在于如何在插入和删除元素时维护堆的性质,这是通过siftUp和siftDown方法实现的。掌握PriorityQueue的源码对于深入理解 Java 集合框架和堆数据结构非常有帮助。