LinkedHashMap
には予測可能な反復順序(挿入順序)があることを知っています。 LinkedHashMap.keySet()
によって返されるSet
とLinkedHashMap.values()
によって返されるCollection
もこの順序を維持しますか?
Mapインターフェースは3つのcollectionビューを提供します。これにより、マップのコンテンツをキーのセット、値のコレクション、またはキーと値のセットとして表示できます。マッピング。マップのorderは、マップのコレクションビューの反復子が要素を返す順序として定義されます。
TreeMap
クラスなどの一部のマップ実装は、順序について特定の保証を行います。HashMap
クラスのような他のものはそうしません。
- マップ
このリンクリストは反復順序を定義します。これは通常、キーがマップに挿入された順序です(insertion-order)。
そのため、はい、keySet()
、values()
、およびentrySet()
(上記の3つのコレクションビュー)は、内部リンクリストが使用する順序で値を返します。そして、はい、Map
とLinkedHashMap
のJavaDocはそれを保証します。
結局のところ、それがこのクラスのポイントです。
ソースを見ると、そのように見えます。 keySet()
、values()
、およびentrySet()
はすべて、内部で同じエントリイテレータを使用します。
LinkedHashMap.keySet()
およびLinkedHashMap.entrySet()
がSetを返すことと混同しないでください。したがって、順序を保証するべきではありません!
Set
は、その実装であるHashSet
、TreeSet
などとのインターフェースです。 HashSet
インターフェイスのSet
実装は、順序付けを保証しません。しかし、TreeSet
はそうです。 LinkedHashSet
も同様です。
したがって、Set
がLinkedHashMap
にどのように実装されているかによって、返される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で利用可能な唯一の反復子are keySet()、entrySet()、values()の反復子です。
したがって、それ以上の資格がない場合は、これらの反復子すべてに適用することが明確に意図されています。
知る限り、それは文書化されていないので、「正式に」そう仮定することはできません。ただし、現在の実装が変更されることはほとんどありません。
順序を確保したい場合は、当然のことながらパフォーマンスコストを支払うことになりますが、マップ全体を反復処理し、選択した順序関数でソートされたセットに挿入することができます。