モジュール java.base
パッケージ java.util

クラスLinkedHashMap<K,​V>

  • 型パラメータ:
    K - このマップで保持されるキーの型
    V - マップされる値の型
    すべての実装されたインタフェース:
    Serializable, Cloneable, Map<K,​V>

    public class LinkedHashMap<K,​V>
    extends HashMap<K,​V>
    implements Map<K,​V>

    予測可能な反復順序を持つMapインタフェースのハッシュ表とリンク・リストの実装です。 この実装は、すべてのエントリをまたがる二重のリンク・リストを保持するという点で、HashMapとは異なります。 このリンク・リストは、反復順序を定義します。この順序は通常、キーがマップに挿入された順序です(挿入順)。 キーがマップに再挿入されても、挿入順は影響を受けません。 m.put(k, v)が呼び出された場合、呼出しの直前にm.containsKey(k)trueを返しても、キーkがマップmに再挿入されます。

    この実装では、HashMapおよびHashtableで提供される未指定(無秩序)の順序がクライアントで起きることはありません(TreeMapのように負荷が増えることもありません)。 この実装を使用することで、元のマップの実装にかかわらず、元のマップと同じ順序のコピーを作成できます。

         void foo(Map m) {
             Map copy = new LinkedHashMap(m);
             ...
         }
     
    この技術は、モジュールが入力としてマップを取り、それをコピーし、順序がコピーの順序で決まる結果を返す場合に、特に役立ちます。 クライアントは一般的に、渡された順序で返されることを想定します。

    特別なconstructorが、リンク・ハッシュ・マップを作成するために提供されています (反復の順序は、そのエントリがアクセスされた順序、つまり、もっとも過去にアクセスされたものから、もっとも新しくアクセスされたものへ(アクセス順))。 この種のマップは、LRUキャッシュを構築するのに最適です。 putputIfAbsentgetgetOrDefaultcomputecomputeIfAbsentcomputeIfPresentまたはmergeメソッドを呼び出すことは、対応するエントリにアクセスすることになります(呼出し完了後にそれが存在することを前提とする)。 replaceメソッドは、値が置換されている場合にはエントリにアクセスするだけになります。 putAllメソッドは、指定されたマップのエントリ・セット・イテレータによってキー値マッピングが提供される順序で、指定されたマップ内の各マッピングへの1回のアクセスを生成します。 他のメソッドはエントリ・アクセスを生成しません。 特に、コレクション・ビューに対する操作はバッキング・マップの反復順序に影響しません

    マップに新しいマッピングが追加されると、自動的に古いマッピングを削除するポリシーを適用するために、removeEldestEntry(Map.Entry)メソッドがオーバーライドされる場合があります。

    このクラスは、任意のMapオペレーションをすべて提供し、null要素を許容します。 HashMapと同じく、ハッシュ関数が複数のバケットに適切に要素を分散すると仮定して、基本のオペレーション(addcontains、およびremove)に一定時間のパフォーマンスを提供します。 パフォーマンスは、1つの例外を除いて、リンク・リストを保持する負荷が増えるために、HashMapのパフォーマンスより少し劣る傾向があります。LinkedHashMapのコレクション・ビューの反復には、容量にかかわらず、マップのサイズに比例した時間が必要になります。 容量に比例した時間を必要とするので、HashMapの反復はさらに負荷が大きくなる傾向があります。

    リンク・ハッシュ・マップには、パフォーマンスに影響を及ぼすパラメータが2つあります。初期容量負荷係数です。 これらは、HashMapについて正確に定義されています。 ただし、このクラスの反復回数は容量により影響を受けないので、初期容量に非常に高い値を選ぶことの負荷は、HashMapに比べて大きくはありません。

    この実装はsynchronizedされません。 複数のスレッドが並行してリンク・ハッシュ・マップにアクセスし、それらのスレッドの少なくとも1つが構造的にマップを変更する場合には、外部でsynchronizedする必要があります これは通常、マップを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。 そのようなオブジェクトが存在しない場合は、Collections.synchronizedMapメソッドを使用してマップを「ラップ」することをお薦めします。 マップが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。

       Map m = Collections.synchronizedMap(new LinkedHashMap(...));
    構造的な変更は、1つまたは複数のマッピングを追加または削除するオペレーションです。アクセス順のリンク・ハッシュ・マップの場合は、反復順序に影響します。 挿入順のリンク・ハッシュ・マップでは、すでにマップに含まれているキーに関連付けられた値を変更するだけの場合は、構造的な変更ではありません。 アクセス順のリンク・ハッシュ・マップでは、getでマップを照会することだけが構造的変更です。

    このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。

    通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

    このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、遅延バインディングおよびフェイルファストで、さらにSpliterator.ORDEREDを報告します。

    このクラスは、Java Collections Frameworkのメンバーです。

    実装上のノート:
    このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、対応するコレクションのイテレータから作成されます。
    導入されたバージョン:
    1.4
    関連項目:
    Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, 直列化された形式
    • コンストラクタの詳細

      • LinkedHashMap

        public LinkedHashMap​(int initialCapacity,
                             float loadFactor)
        指定された初期容量と負荷係数を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
        パラメータ:
        initialCapacity - 初期容量
        loadFactor - 負荷係数
        例外:
        IllegalArgumentException - 初期容量が負であるか、負荷係数が正でない場合
      • LinkedHashMap

        public LinkedHashMap​(int initialCapacity)
        指定された初期容量とデフォルトの負荷係数(0.75)を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
        パラメータ:
        initialCapacity - 初期容量
        例外:
        IllegalArgumentException - 初期容量が負の場合
      • LinkedHashMap

        public LinkedHashMap()
        デフォルトの初期容量(16)と負荷係数(0.75)を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
      • LinkedHashMap

        public LinkedHashMap​(Map<? extends K,​? extends V> m)
        指定されたマップと同じマッピングを持つ、挿入順のLinkedHashMapインスタンスを構築します。 LinkedHashMapインスタンスは、デフォルトの負荷係数(0.75)、および指定されたマップでマッピングを保持するのに十分な初期容量で作成されます。
        パラメータ:
        m - マッピングがこのマップに配置されるマップ
        例外:
        NullPointerException - 指定されたマップがnullの場合
      • LinkedHashMap

        public LinkedHashMap​(int initialCapacity,
                             float loadFactor,
                             boolean accessOrder)
        指定された初期容量、負荷係数、および順序付けモードを持つ、空のLinkedHashMapインスタンスを構築します。
        パラメータ:
        initialCapacity - 初期容量
        loadFactor - 負荷係数
        accessOrder - 順序付けモード - アクセス順ならtrue。挿入順ならfalse
        例外:
        IllegalArgumentException - 初期容量が負であるか、負荷係数が正でない場合
    • メソッドの詳細

      • containsValue

        public boolean containsValue​(Object value)
        このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。
        定義:
        インタフェースMap<K,​V>内のcontainsValue
        Overrides:
        クラスHashMap<K,​V>containsValue
        パラメータ:
        value - このマップにあるかどうかが判定される値
        戻り値:
        このマップが1つまたは複数のキーを指定された値にマッピングしている場合はtrue
      • get

        public V get​(Object key)
        指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。

        つまり、このメソッドは、(key==null ? k==null : key.equals(k))となるキーkから値vへのマッピングがこのマップに含まれている場合はvを返し、それ以外の場合はnullを返します。 (このようなマッピングは1つのみ存在できます。)

        戻り値nullは、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnullにマップすることもあります。 containsKey操作を使うと、これら2つのケースを見分けることができます。

        定義:
        インタフェースMap<K,​V>内のget
        Overrides:
        クラスHashMap<K,​V>get
        パラメータ:
        key - 関連付けられた値が返されるキー
        戻り値:
        指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合はnull
        関連項目:
        HashMap.put(Object, Object)
      • removeEldestEntry

        protected boolean removeEldestEntry​(Map.Entry<K,​V> eldest)
        このマップが一番古いエントリを削除するはずの場合にtrueを返します。 新しいエントリをマップに挿入すると、putおよびputAllによりこのメソッドが呼び出されます。 新しいエントリが追加されるたびに、このメソッドは一番古いエントリを削除する機会を実装側に提供します。 これは、マップがキャッシュを表す場合に有効です。古いエントリを削除することで、マップはメモリー消費を低減できます。

        サンプル使用: このオーバーライドにより、マップはエントリを最大100個まで増加し、新しいエントリが追加されるたびに一番古いエントリを削除できます(エントリ数は常に100個で維持されます)。

             private static final int MAX_ENTRIES = 100;
        
             protected boolean removeEldestEntry(Map.Entry eldest) {
                return size() > MAX_ENTRIES;
             }
         

        このメソッドは通常、マップを変更しません。代わりに、戻り値で指示されたとおりにマップが自身を変更することを許可します。 このメソッドがマップを直接変更することは許可されていますが、変更した場合は、falseを返す必要があります。これは、マップがそれ以上の変更を試みるべきではないことを示します。 このメソッド内からのマップ変更後にtrueを返す効果は未指定です。

        この実装は、falseを返すだけです。そのため、このマップは通常のマップのように動作します。一番古い要素は削除されません。

        パラメータ:
        eldest - もっとも以前にマップに挿入されたエントリ。これがアクセス順マップの場合は、もっとも以前にアクセスされたエントリ。 これは、このメソッドがtrueを返した場合に削除されるエントリである。 この呼出しの原因となったputまたはputAll呼出しが行われる前にマップが空であった場合、これは挿入されたばかりのエントリになる。つまり、マップに単一のエントリが含まれている場合、もっとも古いエントリはもっとも新しいエントリでもある。
        戻り値:
        もっとも古いエントリをマップから削除すべき場合はtrue。そのエントリを保持すべき場合はfalse
      • keySet

        public Set<K> keySet()
        このマップに含まれるキーのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。 セットは要素の削除をサポートします。Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションで対応するマッピングをマップから削除します。 addまたはaddAll操作はサポートされていません。 そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。
        定義:
        インタフェースMap<K,​V>内のkeySet
        Overrides:
        クラスHashMap<K,​V>keySet
        戻り値:
        マップに含まれているキーのセット・ビュー
      • values

        public Collection<V> values()
        このマップに含まれる値のCollectionビューを返します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeCollection.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。 そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。
        定義:
        インタフェースMap<K,​V>内のvalues
        Overrides:
        クラスHashMap<K,​V>values
        戻り値:
        このマップに含まれている値のビュー
      • entrySet

        public Set<Map.Entry<K,​V>> entrySet()
        このマップに含まれるマッピングのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。 そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。
        定義:
        インタフェースMap<K,​V>内のentrySet
        Overrides:
        クラスHashMap<K,​V>entrySet
        戻り値:
        マップ内に保持されているマッピングのセット・ビュー