簡體   English   中英

是否可以保證從LinkedHashMap對象返回鍵和值的順序?

[英]Is the order guaranteed for the return of keys and values from a LinkedHashMap object?

我知道LinkedHashMap具有可預測的迭代順序(插入順序)。 是否Set由歸國LinkedHashMap.keySet()Collection返回由LinkedHashMap.values()也維持這種秩序?

Map界面提供了三個集合視圖 ,這些視圖允許將地圖的內容作為一組鍵,一組值或一組鍵-值映射來查看。 地圖的順序被定義為其中在地圖上的集合視圖迭代返回元素的順序。 一些地圖實現(例如TreeMap類)對其順序做出特定的保證。 其他的(例如HashMap類)則沒有。

- 地圖

此鏈表定義了迭代順序,通常是將鍵插入映射中的順序insert-order )。

-LinkedHashMap

因此,是的, keySet()values()entrySet() (提到的三個集合視圖)按內部鏈表使用的順序返回值。 是的,JavaDoc for MapLinkedHashMap保證了這一點。

畢竟,這就是本課的重點。

從源頭看,看起來確實如此。 keySet()values()entrySet()都在內部使用相同的條目迭代器。

不要與LinkedHashMap.keySet()LinkedHashMap.entrySet()返回Set混淆,因此它不保證排序!

Set是與HashSetTreeSet等實現的接口。 Set接口的HashSet實現不保證排序。 但是TreeSet確實如此。 LinkedHashSet也可以。

因此,這取決於在LinkedHashMap如何實現Set才能知道返回的Set引用是否可以保證排序。 我查看了LinkedHashMap的源代碼,它看起來像這樣:

private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}

因此,LinkedHashMap / HashMap具有自己的Set實現,即KeySet 因此,請勿將此與HashSet混淆。

同樣,通過將元素插入存儲桶的方式來保持順序。 查看LinkedHashMapaddEntry(..)方法,並將其與HashMap方法進行比較,從而突出顯示HashMapLinkedHashMap之間的主要區別。

您可以這樣假設。 Javadoc說“可預測的迭代順序”,並且Map 唯一可用的迭代器 keySet(),entrySet()和values()的迭代器。

因此,在沒有任何進一步限定的情況下,顯然打算將其應用於所有這些迭代器。

AFAIK沒有記錄,因此您不能“正式”假設如此。 但是,當前的實施方式不太可能會改變。

如果您想確保順序,則可能要遍歷整個地圖,然后將其插入具有所選順序功能的排序集中,盡管您自然會支付性能費用。

查看接口,它返回一個普通Set而不是SortedSet 因此,沒有任何保證。

在通過查看實現來假定隱式保證之前(總是一個壞主意),還要查看所有其他Java實現中的實現:)

例如,您最好在構造函數中使用keySet創建一個TreeSet。

我認為您不能假定keySet()和values()的順序。

只要我堅持Map中定義並在HashMap中覆蓋的這兩個方法的協定,就可以輕松編寫LinkedHashMap的實現,該實現返回無序的keySet()和values()。

暫無
暫無

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

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