Java中的PriorityQueue不确定?

Java中的PriorityQueue不确定?,java,priority-queue,Java,Priority Queue,当我运行以下优先级队列测试时: class Run { public static void main(String[] args) { PriorityQueue<Entry> q = new PriorityQueue<>(8, Collections.reverseOrder(new Comparator<Entry>() { @Override public int compare(Entry o1, Ent

当我运行以下优先级队列测试时:

class Run {

public static void main(String[] args) {
    PriorityQueue<Entry> q = new PriorityQueue<>(8, Collections.reverseOrder(new Comparator<Entry>() {

        @Override
        public int compare(Entry o1, Entry o2) {
            return Integer.compare(o1.getValue(), o2.getValue());
        }
    }));

    q.offer(new Entry(100));
    q.offer(new Entry(0));
    q.offer(new Entry(1));
    q.offer(new Entry(-1));
    q.offer(new Entry(0));
    q.offer(new Entry(1));
    q.offer(new Entry(-100));
    q.offer(new Entry(100));

    while (q.peek() != null) {
        System.out.println(q.poll());
    }
}

private static class Entry {

    private static int GLOBAL_ID = 0;

    private final int value, id;

    public Entry(int value) {
        this.value = value;
        id = GLOBAL_ID++;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Entry[" + id + ", value = " + value + ']';
    }
}

我希望以与输入相同的顺序输出相同的元素,因此当在条目7之前提供条目0时,也会在轮询7之前轮询该条目。但为什么条目4突然在1之前被调查?是错误的
比较器
还是
优先级队列
不能保证确定性行为?

它是非确定性的

如果多个元素绑定为最小值,则头部是其中之一 那些元素——纽带是任意断裂的


比较器仅定义值的顺序,而不定义其他内容。正如Rich L的答案指向文档一样,关系是任意断开的。更新比较器以说明对象插入的时间戳/对象的ID。请参阅作为补充:有一个时间戳条目的示例实现,它使标准prio队列具有确定性。可以在的文档中找到它。如果你问我,不是很直观,但是我。
Entry[0, value = 100]
Entry[7, value = 100]
Entry[2, value = 1]
Entry[5, value = 1]
Entry[4, value = 0]
Entry[1, value = 0]
Entry[3, value = -1]
Entry[6, value = -100]