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

クラスLinkedHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.HashMap<K,V>
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とは異なります。これは、すべてのエントリを経由して実行される二重リンク・リストを保持する点です。 このリンク・リストは、反復順序を定義します。この順序は通常、キーがマップに挿入された順序です(挿入順)。 キーがマップに再挿入されても、挿入順は影響を受けません。 (キーkは、m.containsKey(k)が呼出しの直前にtrueを返すときにm.put(k, v)が呼び出されると、マップmに再挿入されます。)

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


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

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

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

このクラスは、オプションのMap操作をすべて提供し、null要素を許可します。 HashMapと同様、ハッシュ関数がバケット間で要素を適切に分散すると、基本操作(addcontainsおよびremove)に対して一定時間のパフォーマンスが提供されます。 リンク・リストを維持する追加コストが1つあるため、パフォーマンスはHashMapのパフォーマンスのわずかに下回る可能性があります: LinkedHashMapのコレクション・ビューに対する反復には、その容量に関係なく、マップのsizeに比例した時間が必要です。 HashMapに対する反復は、その「容量」に比例した時間を必要とする、より高コストになる可能性があります。

リンク・ハッシュ・マップには、パフォーマンスに影響を及ぼすパラメータが2つあります。初期容量負荷係数です。 これらは、HashMapの場合と同様に正確に定義されます。 ただし、このクラスの反復時間は容量の影響を受けないため、初期容量に対して過度に高い値を選択するペナルティは、HashMapよりも厳しいです。

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

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

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

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

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

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

実装上のノート:
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、対応するコレクションのイテレータから作成されます。
導入されたバージョン:
1.4
関連項目:
  • コンストラクタの詳細

    • LinkedHashMap

      public LinkedHashMap(int initialCapacity, float loadFactor)
      指定された初期容量と負荷係数を持つ空の挿入順序のLinkedHashMapインスタンスを構築します。
      APIのノート:
      予想される数のマッピングに対応する初期容量を持つLinkedHashMapを作成するには、newLinkedHashMapを使用します。
      パラメータ:
      initialCapacity - 初期容量
      loadFactor - 負荷係数
      例外:
      IllegalArgumentException - 初期容量が負であるか、負荷係数が正でない場合
    • LinkedHashMap

      public LinkedHashMap(int initialCapacity)
      指定された初期容量およびデフォルトのロード・ファクタ(0.75)を使用して、挿入順序の空のLinkedHashMapインスタンスを作成します。
      APIのノート:
      予想される数のマッピングに対応する初期容量を持つLinkedHashMapを作成するには、newLinkedHashMapを使用します。
      パラメータ:
      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
      オーバーライド:
      クラス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
      オーバーライド:
      クラスHashMap<K,V>get
      パラメータ:
      key - 関連付けられた値が返されるキー
      戻り値:
      指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合はnull
      関連項目:
    • clear

      public void clear()
      すべてのマッピングをマップから削除します。 この呼出しが戻ると、マップは空になります。
      定義:
      インタフェースMap<K,V>内のclear
      オーバーライド:
      クラスHashMap<K,V>clear
    • 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要素は削除されません)を返します。

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

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

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

      public static <K, V> LinkedHashMap<K,V> newLinkedHashMap(int numMappings)
      予想されるマッピング数に適した、新しい空の挿入順序のLinkedHashMapを作成します。 返されるマップではデフォルトのロード係数0.75が使用され、初期容量は通常十分に大きいため、マップのサイズを変更せずに必要な数のマッピングを追加できます。
      型パラメータ:
      K - 新しいマップによって保持されるキーのタイプ
      V - マップされる値の型
      パラメータ:
      numMappings - マッピングの予想数
      戻り値:
      新しく作成されたマップ
      例外:
      IllegalArgumentException - numMappingsが負の場合
      導入されたバージョン:
      19