Java PriorityQueue的内容排序不正确?

Java PriorityQueue的内容排序不正确?,java,Java,Java文档说: 创建具有默认初始容量(11)的PriorityQueue,该队列根据元素的自然顺序对其进行排序 但是当我写一些这样的测试时: public class Test { public static void main (String a[]) { Queue<Integer> queue = new PriorityQueue<Integer>(); for (int i = 1; i <= 20; i++)

Java文档说: 创建具有默认初始容量(11)的PriorityQueue,该队列根据元素的自然顺序对其进行排序

但是当我写一些这样的测试时:

public class Test {

    public static void main (String a[]) {
        Queue<Integer> queue = new PriorityQueue<Integer>();

        for (int i = 1; i <= 20; i++) {
            queue.offer(i);
        }

        System.out.println(queue);

        Queue<Integer> queue2 = new PriorityQueue<Integer>();

        for (int i = 20; i >= 1; i--) {
            queue2.offer(i);
        }

        System.out.println(queue2);
    }
}

Seenm就像两个具有相同内容的队列,它们的内容没有得到相同的顺序?

优先级队列不能保证整个集合的顺序;它所能保证的是最小的元素位于最前面(如果是最大优先级队列,则为最大元素)

从文档中:

方法迭代器()中提供的迭代器不保证 以任何特定顺序遍历优先级队列的元素。 如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。
也许需要添加一点上下文:优先级队列在内部所做的是将元素存储在对数高度的树结构中(在使用树的合理实现中)。
insert
和remove-like操作旨在将最小的元素保留在树的根上,并使每个子树中的元素大于父顶点的元素(这就是它们堆积的原因,该属性称为heap属性)。它不保证子树元素的任何排序,子树元素是同级的,例如从排序树中。堆属性和对数高度是优先级队列快速运行的原因,但它的缺点是,您只能快速获得一个元素,这是最小的元素(或最大堆的最大元素)。

优先级队列不能保证整个集合的顺序;它所能保证的是最小的元素位于最前面(如果是最大优先级队列,则为最大元素)

从文档中:

方法迭代器()中提供的迭代器不保证 以任何特定顺序遍历优先级队列的元素。 如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。
也许需要添加一点上下文:优先级队列在内部所做的是将元素存储在对数高度的树结构中(在使用树的合理实现中)。
insert
和remove-like操作旨在将最小的元素保留在树的根上,并使每个子树中的元素大于父顶点的元素(这就是它们堆积的原因,该属性称为heap属性)。它不保证子树元素的任何排序,子树元素是同级的,例如从排序树中。堆属性和对数高度是优先级队列快速运行的原因,但它的缺点是,您只能快速获得一个元素,而这是最小的元素(或最大堆的最大元素)。

PriorityQueue.toString使用迭代器()不能保证以任何特定顺序(从API)遍历优先级队列的元素。试一试


toString使用迭代器(),它不能保证以任何特定顺序(从API)遍历优先级队列的元素。试一试


(因此,如果反复使用
poll()
队列2实例,您将对元素进行排序)只需在此处添加一点颜色,Java的优先级队列实现基于优先级堆。通过读取堆,可以更好地了解优先级队列的行为@Slanec:是的,那将被排序,这个过程有时被称为
HeapSort
,这是因为优先级队列通常被实现为具有某种排序不变量的堆。非常感谢您的解释。似乎是当offer()从1到20 C的项构造了一棵树,它与反向构造的树不同。我会花些时间看看你在那里发布的wiki页面。再次感谢大家。(因此,如果您反复使用
poll()
队列2实例,您将对元素进行排序)只需在此处添加一点颜色,Java的优先级队列实现是基于优先级堆的。通过读取堆,可以更好地了解优先级队列的行为@Slanec:是的,那将被排序,这个过程有时被称为
HeapSort
,这是因为优先级队列通常被实现为具有某种排序不变量的堆。非常感谢您的解释。似乎是当offer()从1到20 C的项构造了一棵树,它与反向构造的树不同。我会花些时间看看你在那里发布的wiki页面。再次感谢各位。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 2, 7, 4, 3, 10, 8, 11, 5, 12, 13, 19, 15, 16, 9, 20, 14, 17, 6, 18]
    while(!queue.isEmpty()) {
            System.out.print(queue.poll() + ",");
    }