整数数据如何插入优先队列(顺序看不懂)

How Integer Data get Inserted in Prioroty Queue(Sequence Not able to undestand)

我正在学习 Collection 框架中 Java 的优先级队列。

目前我正在讨论优先队列这个话题。我参考了下面的article and this video来学习,然后我在IDE

上测试了代码
int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer>  pq = new PriorityQueue<>();
for(int f:ar)
pq.add(f);

当我打印 pq 时,我得到 [1, 3, 12, 9, 5]

这个顺序是怎么排列的(这里的优先级是什么?)我没看懂,不是升序也不是降序。请指导

它存储为最小堆。详细了解最小堆

PriorityQueue 以自然顺序存储元素,除非在创建队列时提供 Comparator

int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer>  pq = new PriorityQueue<>();
for(int f:ar)
  pq.add(f);
System.out.println(pq);

结果是 [1, 3, 12, 9, 5],因为 AbstractCollection class 的 toString 方法在打印队列时被调用。

public String toString() {
  Iterator<E> it = iterator();
  if (! it.hasNext())
    return "[]";

  StringBuilder sb = new StringBuilder();
  sb.append('[');
  for (;;) {
    E e = it.next();
    sb.append(e == this ? "(this Collection)" : e);
    if (! it.hasNext())
      return sb.append(']').toString();
    sb.append(',').append(' ');
  }
}
这里使用的

iterator() 是在 PriorityQueue class 中实现的,它没有 return 任何特定顺序的元素。因此,当您打印优先级队列时,它会无序地打印元素。

/**
 * Returns an iterator over the elements in this queue. The iterator
 * does not return the elements in any particular order.
 *
 * @return an iterator over the elements in this queue
 */
public Iterator<E> iterator() {
    return new Itr();
}

如果你想知道队列中元素的存储顺序,你必须轮询元素并打印它们。

int ar[] = {3, 5, 12, 9, 1};
PriorityQueue<Integer>  pq = new PriorityQueue<>(ar.length);
for(int f:ar)
  pq.add(f);

while(!pq.isEmpty())
  System.out.println(pq.poll());

这将按照元素的存储顺序为您提供元素。

1
3
5
9
12