2017-04-06 75 views
1

我假設由於集合中的不可修改方法返回底層集合的視圖或外觀。這似乎是不言而喻的,unmodifiableList將使用基礎列表的順序和unmodfiableSet可以自由地做任何事情,因爲沒有排序。Java Collections.unmodifiableCollection是否保留底層集合的順序?

我使用的是一個LinkedHashSet這是一個集合,但確實保留了排序,並且試圖公開一個保留基礎排序的集合的不可修改視圖。使用unmodifiableSet似乎不合適,但我不能使用unmodifiableList。我無法找到保證,unmodifiableCollection將使用任何排序在底層集合,雖然我懷疑它會。

任何人都可以指出我定義這種行爲的規範還是與之矛盾?

+0

在這種情況下爲一組作爲對象的構造過程中創建的,我可以用番石榴UnmodifiableSet而不是進一步調查該集合保留插入順序是由「後來的」重複條目的影響。但是,這隻涵蓋了我在施工期間創建集合並且從未更新過的特定情況。 – JustifiedAndAncient

回答

1

Collections.unmodifiableXXX的調用只是簡單地創建了一個簡單的包裝器,在進行變異方法調用時拋出異常。所有其他方法調用都會傳遞到底層集合,所以除了原始集合之外,沒有其他任何方法會影響排序或其他內容。

包裝沒有狀態,它只包含對底層集合的引用。

整個UnmodifiableSet包裝是非常小的,並且隨着迭代器(來自UnmodifiableCollection繼承)使用從底層集合迭代器(除了它覆蓋remove()),則迭代順序完全一樣的原始集合英寸

static class UnmodifiableSet<E> extends UnmodifiableCollection<E> 
          implements Set<E>, Serializable { 
    private static final long serialVersionUID = -9215047833775013803L; 

    UnmodifiableSet(Set<? extends E> s)  {super(s);} 
    public boolean equals(Object o) {return o == this || c.equals(o);} 
    public int hashCode()   {return c.hashCode();} 
} 
+0

謝謝@Kayaman我相信它會做我希望它做的一切,因爲文檔說所有查詢操作都會讀取到指定的集合。我想在這種情況下,查詢包括迭代順序,但我有點想發現定義爲真實的是某種文檔。 LinkedHashSet被定義爲使用一個列表來保存元素的插入順序,但是我不能對它做一個不可修改的列表視圖。 – JustifiedAndAncient

+0

當然,你不能。它不是'List',它是'OrderedSet'。 – Kayaman

+0

很好,它只是使用一個維護插入順序,但沒有Collections.unmodifiableOrderedSet,所以我有Set或Collection。對我而言,意味着數學概念沒有暗示的順序,但是如果實際上保證保持完美的基礎集合的排序。我只是在尋找這個保證的參考文檔 – JustifiedAndAncient

相關問題