2
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(4);
queue.add(8);
queue.add(5);
queue.add(23);
queue.add(6);
System.out.println(queue);

朋友们, Ubuntu 12.10 和 Oracle Java 1.6 和 Java 1.7 上的上述代码,打印输出为

[5, 6, 23, 8]

我相信这是错误的。这应该改为打印为[5, 6, 8, 23] 这是一个缺陷吗?还是我对优先队列的理解是错误的?

除此之外,如果我在之前或之后更改将 23 添加到 PriorityQueue 的位置,这将按预期工作。

4

2 回答 2

7

该类toString()方法AbstractCollection(这是PriorityQueue使用的)声明它:

返回此集合的字符串表示形式。字符串表示由集合元素的列表组成,按其迭代器返回的顺序排列,用方括号 ("[]") 括起来。

如果您查看PriorityQueue iterator 的文档,它会指出:

返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。

只有当您从队列中提取项目时,优先级才会发挥作用,而不是当您获得它们的字符串表示时。

于 2012-11-27T12:25:27.480 回答
4

这只是字符串表示。尝试remove()多次调用。

System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());

这将导致

5
6
8
23
于 2012-11-27T12:24:26.403 回答