PriorityQueue没有正确排序其内容?

Ter*_*hao 1 java

Java Doc说:创建一个PriorityQueue,其默认初始容量(11)根据其自然顺序对其元素进行排序.

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

[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]
Run Code Online (Sandbox Code Playgroud)

Seenm喜欢两个具有相同内容的队列,他们的内容没有获得相同的顺序?

G. *_*ach 6

优先级队列不保证整个集的排序; 所有它保证最小元素在前面(或者最大,如果它是最大优先级队列).

来自文档:

方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素.如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray()).

也许添加一些上下文:内部优先级队列的作用是将元素存储在对数高度的树结构中(无论如何使用树的敏感实现).该insert和删除般的操作旨在保持最小的元素在那树的根,并保持元素中的每个子树比父顶点的元件大(这是什么使得他们堆,这个属性被称为堆性质) .它并不保证对兄弟姐妹的子元素进行任何排序,例如我们从排序树中知道它.堆属性和对数高度是优先队列的快速操作运行时间,但它带来的缺点是你只能快速获得一个元素,这是最小的元素(或最大堆的最大元素).