[英]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 )。
因此,是的, keySet()
, values()
和entrySet()
(提到的三個集合視圖)按內部鏈表使用的順序返回值。 是的,JavaDoc for Map
和LinkedHashMap
保證了這一點。
畢竟,這就是本課的重點。
從源頭看,看起來確實如此。 keySet()
, values()
和entrySet()
都在內部使用相同的條目迭代器。
不要與LinkedHashMap.keySet()
和LinkedHashMap.entrySet()
返回Set混淆,因此它不保證排序!
Set
是與HashSet
, TreeSet
等實現的接口。 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
混淆。
同樣,通過將元素插入存儲桶的方式來保持順序。 查看LinkedHashMap
的addEntry(..)
方法,並將其與HashMap
方法進行比較,從而突出顯示HashMap
和LinkedHashMap
之間的主要區別。
您可以這樣假設。 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.