优先队列中的元素何时排序?

When are elements ordered in PriorityQueues?

PriorityQueue class 是按优先级插入元素,还是只是当我们轮询元素时才找出最高优先级的元素并 returns 它?

来自JDK本身的源代码(格式化我的):

表示为平衡二叉堆的优先级队列:queue[n]的两个children是queue[2*n+1]queue[2*(n+1)]

如果比较器为空[=29=,则优先级队列按comparator或元素的自然顺序排序]:对于堆中的每个节点nnn <= d的每个后代d。具有最低值的元素在 queue[0] 中,假设队列是 non-empty.

因此,您可以将 PriorityQueue 中的 insertion/deletion 元素视为提供结果以及堆平衡的操作。

正如其他人所提到的,PriorityQueue 类 内部维护着一个 binary heap,并且该堆中项目的顺序由默认顺序或比较器确定.二进制堆在列表中维护。

您的问题询问元素何时排序。当您将项目添加到队列或从队列中删除项目时,项目的顺序将重新排列,以便最高优先级的项目位于堆的顶部:列表中的索引 0。所以你的主要问题的答案是 PriorityQueue 总是 知道哪个是最高优先级的项目。这使得 peek() 函数非常有效。

列表其余部分的项目顺序有点复杂。列表的其余部分是有序的,但不一定是有序的。排序使得在插入或移除之后重新排列堆是有效的。有关堆排序的详细信息,请参阅上面关于二进制堆的链接文章。