180

LinkedHashMap予測可能な反復順序(挿入順序)があることはわかっています。Set返品者LinkedHashMap.keySet()Collection返品者LinkedHashMap.values()もこの順序を維持していますか?

4

7 に答える 7

245

Map インターフェースは 3 つの コレクション ビューを提供します。これにより、マップのコンテンツをキーのセット、値のコレクション、またはキーと値のマッピングのセットとして表示できます。マップの順序は、マップのコレクション ビューの反復子が要素を返す順序として定義されます。クラスなどの一部のマップ実装ではTreeMap 、順序に関して特定の保証が行われます。クラスのような他のものは HashMapそうではありません。

--地図

この連結リストは反復順序を定義します。これは通常、キーがマップに挿入された順序 ( insert-order ) です。

-- LinkedHashMap

したがって、はい、、、keySet()およびvalues()(entrySet()前述の 3 つのコレクション ビュー) は、内部リンク リストが使用する順序で値を返します。そして、はい、それMapLinkedHashMap保証する JavaDoc です。

結局のところ、それがこのクラスのポイントです。

于 2010-05-27T19:15:21.823 に答える
12

ソースを見ると、そうであるように見えます。keySet()、、values()およびentrySet()すべてが内部で同じエントリイテレータを使用します。

于 2010-05-27T18:39:51.393 に答える
7

LinkedHashMap.keySet()Setを返すことと混同しないLinkedHashMap.entrySet()でください。したがって、順序を保証するものではありません。

SetなどとのインターフェースでありHashSetTreeSetその実装です。インターフェイスのHashSet実装は、Set順序付けを保証しません。しかし、TreeSetそうです。また、LinkedHashSetそうです。

したがって、返される Set 参照が順序付けを保証するかどうかは、がどのようSetに実装されているかに依存します。LinkedHashMapのソースコードを確認LinkedHashMapしたところ、次のようになりました。

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

Setしたがって、LinkedHashMap/HashMap にはieの独自の実装がありKeySetます。したがって、これを と混同しないでくださいHashSet

また、順序は要素がバケットに挿入される方法によって維持されます。の方法を見て、との主な違いを強調している のaddEntry(..)方法LinkedHashMapと比較してください。HashMapHashMapLinkedHashMap

于 2015-10-01T14:03:32.960 に答える
5

そう推測できます。Javadoc には「予測可能な反復順序」と記載されており、Map で使用できる唯一の反復子は keySet()、entrySet()、および values() の反復子です。

したがって、それ以上の修飾がない場合は、それらのイテレータすべてに適用することを明確に意図しています。

于 2010-05-28T05:51:45.103 に答える
0

AFAIKは文書化されていないため、「正式に」そのように想定することはできません。ただし、現在の実装が変更される可能性はほとんどありません。

順序を確認したい場合は、マップ全体を繰り返し処理し、選択した順序関数を使用して並べ替えられたセットに挿入することをお勧めします。ただし、当然、パフォーマンスコストは発生します。

于 2010-05-27T18:40:28.960 に答える
-3

Setインターフェイスを見ると、ではなくプレーンが返されますSortedSet。したがって、保証はありません。

実装(常に悪い考え)を見て暗黙の保証を想定する前に、他のすべてのJava実装の実装も見てください:)

たとえば、コンストラクターでkeySetを使用してTreeSetを作成することをお勧めします。

于 2010-05-27T18:39:16.747 に答える
-4

keySet() と values() の順序を推測できるとは思いません。

Map で定義され、HashMap でオーバーライドされるこれら 2 つのメソッドの規約に固執する限り、順不同の keySet() と values() を返す LinkedHashMap の実装を簡単に作成できます。

于 2014-11-14T20:10:26.737 に答える