简单的Java PriorityQueue 错误

我正在做的是将三个字符串添加到Java PriorityQueue然后将它们打印出来这是我的代码:

import java.util.*; import java.lang.*; class Main { public static void main (String[] args) throws java.lang.Exception { PriorityQueue pq=new PriorityQueue(); pq.add("abc"); pq.add("ability"); pq.add("aberdeen"); String s="ability"; System.out.println(s.compareTo("aberdeen")); System.out.println(pq); } } 

这是输出:

 4 [abc, ability, aberdeen] 

这不应该是abc, aberdeen, ability而是abc, aberdeen, ability 。 既然这是正确的字母顺序?

PriorityQueue.iterator()的文档:

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

这就是toString()用来构造字符串表示的原因,因为实现是从AbstractCollectioninheritance的 :

返回此集合的字符串表示forms。 字符串表示由一个集合元素的列表组成,它们按迭代器返回的顺序排列,用方括号(“[]”)括起来。 […]

尝试将结果出列,然后您将获得预期的顺序:

 while (pq.size() > 0) { System.out.println(pq.poll()); } 

输出:

 abc aberdeen ability 

队列正常工作。 运行此代码:

 PriorityQueue pq=new PriorityQueue(); pq.add("abc"); pq.add("ability"); pq.add("aberdeen"); System.out.println(pq); for (String s; (s = pq.poll()) != null;) System.out.println(s); 

它会打印出来

 [abc, ability, aberdeen] abc aberdeen ability 

原因在于优先级语义仅适用于出列操作,而在其他方面,队列仅受普通java.util.Collection约束:它的迭代器不需要观察任何特定的顺序,并且具体来说, PriorityQueue的迭代器恰好遵守插入顺序。