2017-10-19 133 views
4

構造函數LinkedHashSet(Collection<? extends E> c)是否保證其參數的保存順序,假設參數是一個有序集合?我們如何確定這一點?LinkedHashSet構造函數是否保存順序

的Javadoc文檔隻字未提順序:

構造一個新的鏈接哈希具有相同元素的 指定集合設置。鏈接的哈希集創建時的容量足以容納指定集合 中的元素和默認加載因子(0.75)。

我沒有看到任何理由不維護秩序,但我想知道它是否有保證(目前和未來的實施)。

+1

[JDoc](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html) - >'這個鏈表定義了迭代順序,它是順序元素被插入集合(插入順序)。請注意,如果元素重新插入到集合中,則插入順序不受影響。 (如果s.contains(e)在調用之前立即返回true,則調用s.add(e)時,將元素e重新插入到集合s中。)'基本上它維護插入順序。這允許您按照插入元素的順序遍歷集合。 – Sedrick

+1

@SedrickJefferson好的。該文件的這一部分表明,訂單將被保留。 – AnnTea

回答

1

縱觀Java的8實現java.util.LinkedHashSet的你有這樣的構造:

public LinkedHashSet(Collection<? extends E> c) { 
    super(Math.max(2*c.size(), 11), .75f, true); 
    addAll(c); 
} 

那麼什麼是addAll的內容?

public boolean addAll(Collection<? extends E> c) { 
    boolean modified = false; 
    for (E e : c) 
     if (add(e)) 
      modified = true; 
    return modified; 
} 

addAll使用一個循環,通過構造函數中使用的集合:

for (E e : c) 

這意味着,如果在構造函數中使用收取執行是有序的(如java.util.TreeSet),那麼新的內容LinkedHashSet實例也將被訂購。

Java 9中的實現非常相似。

是的,在訂購傳入收集的情況下訂單被保留。

您只能通過檢查此特定情況下的實現來確定這一點。

+0

接受因爲「您只能通過檢查此特定情況下的實施來確定這一點。」 – AnnTea

2

它保留通過集合的迭代器返回的順序,因爲它interntally使用addAll

遍歷指定的集合,並添加迭代器返回到這個集合中的每個對象,反過來。

+0

您是否暗示實現無法更改?什麼保證? – AnnTea

+3

@AnnTea技術上沒有保證。然而,考慮到沒有什麼需要改進的地方,它們會改變實現,而且Java向後兼容的數量是不可思議的。儘管如此,創建自己的JDK並以不同的方式實現它並不符合規範。 – Kayaman

+0

@Kayaman這可能是我正在尋找的答案(儘管不希望)。 – AnnTea

相關問題