簡體   English   中英

Java中的PriorityQueue不確定嗎?

[英]PriorityQueue in Java not deterministic?

當我運行以下優先級隊列測試時:

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 + ']';
    }
}

}

我得到以下結果:

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]

我期望相同的元素以與它們輸入相同的順序輸出,因此當在條目7之前提供條目0時,也在輪詢7之前輪詢它。 但為什么入口4突然在1之前被調查? 它是錯誤的Comparator還是PriorityQueue不保證確定性行為?

這是不確定的。

來自PriorityQueue文檔

如果多個元素被綁定為最小值,則頭部是這些元素之一 - 關系被任意打破。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM