为什么在java中轮询方法之后PriorityQueue中的值会发生变化?

为什么在java中轮询方法之后PriorityQueue中的值会发生变化?,java,collections,priority-queue,Java,Collections,Priority Queue,这是代码,输出在下面为什么值为5和6?我的意思是,PriorityQueue中轮询方法之后的新优先级设置与队列中的其他元素类似。我正在准备java认证考试,由于这个概念,我总是倾向于选择错误的答案,欢迎任何帮助 import java.util.*; public class PriorityQueueDemo { public static void main(String args[]) { // create priority queue PriorityQueue < I

这是代码,输出在下面为什么值为5和6?我的意思是,PriorityQueue中轮询方法之后的新优先级设置与队列中的其他元素类似。我正在准备java认证考试,由于这个概念,我总是倾向于选择错误的答案,欢迎任何帮助

import java.util.*;

public class PriorityQueueDemo {
public static void main(String args[]) {
  // create priority queue
  PriorityQueue < Integer >  prq = new PriorityQueue < Integer > (); 

  // insert values in the queue
  for ( int i = 3; i  <  10; i++ ){  
     prq.add (new Integer (i)) ; 
  }

  System.out.println ( "Initial priority queue values are: "+ prq);

  // get the head from the queue
  Integer head = prq.poll();

  System.out.println ( "Head of the queue is: "+ head);

  System.out.println ( "Priority queue values after poll: "+ prq);
 }
}
票数

检索并删除此队列的头,如果此队列为空,则返回null

如果不想移除它,请致电peek

检索但不删除此队列的头,如果此队列为空,则返回null

顺序:优先级队列通过不对其所有元素进行排序来实现高性能[Ologn enqueing和dequeing时间,固定检索时间]。它只进行部分排序,以使最少的元素到达头部位置。因此,当继承的AbstractCollectiontoString方法遍历元素时,只有第一个元素是按排序的。删除head元素时,会进行更多排序,而其他元素会更改相对位置

查看维基百科了解工作原理。

Per,poll

检索并删除此队列的头,如果此队列为空,则返回null

如果不想移除它,请致电peek

检索但不删除此队列的头,如果此队列为空,则返回null

顺序:优先级队列通过不对其所有元素进行排序来实现高性能[Ologn enqueing和dequeing时间,固定检索时间]。它只进行部分排序,以使最少的元素到达头部位置。因此,当继承的AbstractCollectiontoString方法遍历元素时,只有第一个元素是按排序的。删除head元素时,会进行更多排序,而其他元素会更改相对位置


查看维基百科了解工作原理。

值没有改变,只是以不同的顺序打印。 for PriorityQueue按照迭代器返回元素的顺序返回元素。如果您阅读Javadoc,您会看到以下内容:

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


因此,您无法从打印输出中得出任何结论,因为PriorityQueue没有努力按任何特定顺序、优先级或其他方式打印它们。

值没有改变,只是按不同的顺序打印。 for PriorityQueue按照迭代器返回元素的顺序返回元素。如果您阅读Javadoc,您会看到以下内容:

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


因此,您无法从打印输出中得出任何结论,因为PriorityQueue没有努力按照任何特定顺序、优先级或其他方式打印它们。

对于考试,请记住PriorityQueue总是以正确的顺序创建第一个条目,其余条目可以以任何顺序创建,因为

方法迭代器中提供的迭代器不保证 以任何特定顺序遍历优先级队列的元素


这个技巧节省了我在考试中回答一些技巧性问题的时间。记住PriorityQueue总是以正确的顺序创建第一个条目,其余条目可以是任意顺序,因为

方法迭代器中提供的迭代器不保证 以任何特定顺序遍历优先级队列的元素


这个技巧节省了我在考试中回答一些技巧性问题的时间。但是,toString是否在任何地方指定以正确的顺序打印第一个条目?Javadoc似乎只说不保证任何特定顺序。如果是这样,他们怎么能在考试中问这个问题?当然,根据其他答案的选择,可能还有其他线索。但是,toString是否在任何地方指定以正确的顺序打印第一个条目?Javadoc似乎只说不保证任何特定顺序。如果是这样,他们怎么能在考试中问这个问题?当然,根据其他答案的选择,可能还有其他线索。如果没有看到其他可能的答案,很难说。未指定打印元素的顺序。但是你可以根据元素的数量和显示的值得出结论。很难说没有看到其他可能的答案。未指定打印元素的顺序。但是你可以根据元素的数量和显示的值得出结论。太棒了!谢谢,太棒了!谢谢
Initial priority queue values are: [3, 4, 5, 6, 7, 8, 9]
Head of the queue is: 3
Priority queue values after poll: [4, 6, 5, 9, 7, 8]