Java优先级队列行为,队列中有3个元素

Java优先级队列行为,队列中有3个元素,java,priority-queue,Java,Priority Queue,根据PriorityQueue的定义,它表示: 优先级队列的元素根据其优先级排序 自然排序,或由队列构造时提供的比较器进行排序 时间,取决于使用的构造函数 但是当我尝试处理队列中的3个元素时,这些元素似乎没有正确排序 Queue<Integer> q2 = new PriorityQueue<Integer>(); q2.add(9); q2.add(7); q2.add(8); Iterator<Integer> i

根据PriorityQueue的定义,它表示:

优先级队列的元素根据其优先级排序 自然排序,或由队列构造时提供的比较器进行排序 时间,取决于使用的构造函数

但是当我尝试处理队列中的3个元素时,这些元素似乎没有正确排序

    Queue<Integer> q2 = new PriorityQueue<Integer>();
    q2.add(9);
    q2.add(7);
    q2.add(8);

    Iterator<Integer> i = q2.iterator();
    while(i.hasNext()){
        Integer e = i.next();
        System.out.println(e);
    }
[编辑] 如果元素数为4,则排序似乎正确

    q2.add(9);
    q2.add(7);
    q2.add(8);
    q2.add(5);

    Iterator<Integer> i = q2.iterator();
    while(i.hasNext()){
        Integer e = i.next();
        System.out.println(e);
    }

问题是您使用的是
迭代器
,它不能保证队列遍历期间的任何顺序。
PriorityQueue
的Javadoc说:

方法
Iterator()
中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用<代码>数组。排序(pq.toRayay.)(<代码>)。

轮询队列时,您将获得正确的顺序:

while (!q2.isEmpty()) {
  System.out.println(q2.poll());
}

问题是您使用的是
迭代器
,它不能保证队列遍历期间的任何顺序。
PriorityQueue
的Javadoc说:

方法
Iterator()
中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用<代码>数组。排序(pq.toRayay.)(<代码>)。

轮询队列时,您将获得正确的顺序:

while (!q2.isEmpty()) {
  System.out.println(q2.poll());
}

为什么要投否决票?这个答案有问题吗?为什么投反对票?这个答案有问题吗?
while (!q2.isEmpty()) {
  System.out.println(q2.poll());
}