Java中的priorityQueue顺序?

Sac*_*rma 5 java queue collections priority-queue

我无法理解PriorityQueueJava中的顺序.据我所知,他们是基于堆的,他们不能提供精确的迭代顺序作为插入顺序.我想知道然后在什么基础上priorityQueue自己排序.给定代码:

PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.offer("hepqo");
        pq.offer("bro");
        pq.offer("wassup");
        pq.offer("okay");
        pq.offer("bingo");
        pq.offer("first");
        pq.offer("last");
        pq.offer("ssup");
        System.out.println("polled "+pq.poll());
        System.out.println(pq);
        String str[] = pq.toArray(new String[0]);
        Arrays.sort(str);
        for(String str1:str){
            System.out.println(str1);
        }
Run Code Online (Sandbox Code Playgroud)

产生输出:

polledbingo
[bro, hepqo, first, okay, ssup, wassup, last]
bro
first
hepqo
last
okay
ssup
wassup
Run Code Online (Sandbox Code Playgroud)

即使我将其转换为数组,订单也会丢失.
我觉得这甚至不是String的自然订购.
有没有办法维护优先级队列的插入顺序?
他们在什么基础上排序?

Zim*_*oot 3

队列根据字符串的字典顺序进行排序,这是它们的自然顺序(即“b”在“f”之前,“f”在“h”之前,等等)。如果您希望队列保持插入顺序,请使用 vanillaQueue而不是PriorityQueue

  • @Zim-ZamO'Pootertoot 不。请参阅 Javadoc:“‘iterator()’方法中提供的‘Iterator’不保证以任何特定顺序遍历优先级队列的元素。” 排序仅通过“peek()”和“poll()”方法提供。 (4认同)
  • @Sachin Verma [toArray](http://docs.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html#toArray%28%29) 输出的元素没有特定的顺序 - 它是只有“poll”、“iterator”等保证遵守队列的顺序 (2认同)