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喜欢两个具有相同内容的队列,他们的内容没有获得相同的顺序?
优先级队列不保证整个集的排序; 所有它保证最小元素在前面(或者最大,如果它是最大优先级队列).
来自文档:
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素.如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray()).
也许添加一些上下文:内部优先级队列的作用是将元素存储在对数高度的树结构中(无论如何使用树的敏感实现).该insert和删除般的操作旨在保持最小的元素在那树的根,并保持元素中的每个子树比父顶点的元件大(这是什么使得他们堆,这个属性被称为堆性质) .它并不保证对兄弟姐妹的子元素进行任何排序,例如我们从排序树中知道它.堆属性和对数高度是优先队列的快速操作运行时间,但它带来的缺点是你只能快速获得一个元素,这是最小的元素(或最大堆的最大元素).
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |