PriorityQueue底层基于最小堆实现,保证堆顶最小且满足父子大小关系,而非全局有序;插入时新元素上浮、删除时末尾元素下沉,均耗时O(log n);因只需快速获取最小值,故比全排序更高效。

PriorityQueue 底层用的是最小堆(小根堆),不是按整个数组排好序,而是保证“堆顶最小”,其余元素只满足父子大小关系,不追求全局有序。
最小堆的结构约束
它是一棵完全二叉树,用数组顺序存储:
- 下标为 i 的节点,父节点在 (i−1)/2(整除)
- 左孩子在 2i+1,右孩子在 2i+2
- 每个非叶节点的值 ≤ 它的左右子节点(即:父 ≤ 子)
- 所以堆顶(下标 0)永远是当前所有元素中的最小值
插入新元素时怎么维持最小堆
新元素加到数组末尾,然后“上浮”(sift-up):
- 比较它和父节点,若比父小,就交换
- 继续向上比较,直到它 ≥ 父节点,或到达堆顶
- 这个过程最多比较 log₂n 次,时间复杂度 O(log n)
取最小值(poll)后怎么重平衡
取出堆顶后,把最后一个元素挪到堆顶,再“下沉”(sift-down):
- 拿当前节点和两个子节点中较小的那个比较
- 如果当前节点更大,就和那个较小的子节点交换
- 重复该过程,直到它 ≤ 两个子节点,或没有子节点为止
- 同样只需 O(log n) 时间
为什么不用全排序却能高效支持优先级操作
因为 PriorityQueue 只关心“谁最小”,不关心其余元素之间的大小顺序:
- 堆结构天然支持 O(1) 查最小、O(log n) 插入/删除最小
- 全排序需要 O(n log n),还额外占用空间或破坏插入效率
- 像任务调度、Top-K、合并 K 个有序链表等场景,只需要反复拿最小,堆是最优解










