Queue queue3 = new PriorityQueue<>();
queue3.add("abc");
queue3.add("aae");
queue3.add("三个a");
System.out.println(queue3);
为什么这个程序,在没有插入"三个a"的时候,队列输出元素顺序是"abc,aae",然后插入"三个a"之后,元素输出顺序就变成了"三个a,abc,aae"?
因为平台不让输入"aa.a"(三个a)这种格式,所以我用文字表达了
因为你用的是优先级堆的无界队列,不保证插入顺序是输出顺序。根据元素的优先级进行排序,高优先级的元素将靠近队头,你自己的"三个a"的 Unicode 值比 "abc" 和 "aae" 的值小,所以有更高的优先级会被放置在队列的前面
这是因为 Java 中的 PriorityQueue 是基于堆实现的,并且根据元素的自然顺序进行排序(或者在构造 PriorityQueue 时指定的 Comparator 排序),每次添加新元素时都会重新调整堆结构以保证队列中的元素有序。
具体地说,当你创建一个 PriorityQueue 并向其中添加元素时,每个元素被添加到队列的末尾,并根据其自然顺序(或使用指定的 Comparator 排序)调整堆结构。由于 "abc" 和 "aae" 的自然顺序相同(即都是按字典序从小到大排序),所以这两个元素的相对顺序可能与它们最初插入队列的顺序不同。因此,在往队列中第三次添加元素 "aaa" 时,会重新调整堆结构以保证队列中的元素有序,从而导致输出的元素顺序发生变化。
如果要保持插入顺序,而不是按自然顺序排序,可以考虑使用 LinkedList 来模拟队列,并使用 add() 方法添加元素,然后按插入顺序输出队列中的元素。例如:
Queue<String> queue = new LinkedList<>();
queue.add("abc");
queue.add("aae");
queue.add("aaa");
for (String s : queue) {
System.out.println(s);
}
这段代码会输出:
abc
aae
aaa
其中的元素顺序与它们最初插入队列的顺序相同。
PriorityQueue排序方式是堆排序