モジュール 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>, SequencedMap<K,V>

public class LinkedHashMap<K,V> extends HashMap<K,V> implements SequencedMap<K,V>

Mapインタフェースのハッシュ表およびリンク・リスト実装。検出順序は明確に定義されています。 この実装は、HashMapとは異なります。これは、すべてのエントリを経由して実行される二重リンク・リストを保持する点です。 このリンク・リストでは、検出順序(反復の順序)を定義します。これは通常、マップ(insertion-order)にキーが挿入された順序です。 最も最近挿入されたエントリ(最年長)が最初で、最も新しいエントリが最後です。 キーがputメソッドを使用してマップにre-insertedである場合、検出順序は影響を受けません。 (キーkは、m.containsKey(k)が呼出しの直前にtrueを返すときにm.put(k, v)が呼び出されると、マップmに再挿入されます。) このマップの逆順のビューは逆の順序で、最年少のエントリが最初に表示され、最年長のエントリが最後に表示されます。 マップにすでに存在するエントリの出現順序は、putFirstおよびputLastメソッドを使用して変更できます。

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


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

特別なconstructorが提供され、リンクされたハッシュ・マップが作成されます。このハッシュ・マップは、エントリが最後にアクセスされた順序で、最も最近アクセスされたものから最も新しいものへの順序です。(access-order)。 この種のマップは、LRUキャッシュを構築するのに最適です。 putputIfAbsentgetgetOrDefaultcomputecomputeIfAbsentcomputeIfPresentまたはmergeメソッドを呼び出すことは、対応するエントリにアクセスすることになります(呼出し完了後にそれが存在することを前提とする)。 replaceメソッドは、値が置換されている場合にはエントリにアクセスするだけになります。 putAllメソッドは、指定されたマップのエントリ・セット・イテレータによってキー値マッピングが提供される順序で、指定されたマップ内の各マッピングへの1回のアクセスを生成します。 他のメソッドはエントリ・アクセスを生成しません。 逆仕訳済ビューでこれらのメソッドを起動すると、バッキング・マップのエントリへのアクセスが生成されます。 逆方向ビューでは、エントリにアクセスすると、エントリが最初に出現順に移動することに注意してください。 putFirstlastEntryなどの明示的な配置メソッドは、マップ上か逆順のビュー上かに関係なく、配置操作を実行し、エントリ・アクセスを生成しません。 keySetvaluesおよびentrySetビューに対する操作、または順序付けされた対応する操作が、バッキング・マップの発生順序に影響しません。

マップに新しいマッピングが追加されると、自動的に古いマッピングを削除するポリシーを適用するために、removeEldestEntry(Map.Entry)メソッドがオーバーライドされる場合があります。 または、"長老"エントリが出現順に最初のエントリであるため、プログラムはfirstEntryおよびpollFirstEntryメソッドを使用して古いマッピングを検査および削除できます。

このクラスは、オプションのMapおよびSequencedMap操作をすべて提供し、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 - 初期容量が負であるか、負荷係数が正でない場合
  • メソッドの詳細

    • putFirst

      public V putFirst(K k, V v)
      指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。 この操作が正常に完了すると、指定されたマッピングがこのマップに存在し、このマップの出現順序の最初のマッピングになります。

      このマップにこのキーのマッピングがすでに含まれている場合、マッピングは必要に応じて再配置され、最初に検出された順序になります。

      定義:
      インタフェースSequencedMap<K,V>内のputFirst
      パラメータ:
      k - キー
      v - 値
      戻り値:
      以前kに関連付けられていた値。関連付けられていない場合はnull
      導入されたバージョン:
      21
    • putLast

      public V putLast(K k, V v)
      指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。 この操作が正常に完了すると、指定されたマッピングがこのマップに存在し、このマップの出現順序の最後のマッピングになります。

      このマップにこのキーのマッピングがすでに含まれている場合は、必要に応じてマッピングが再配置され、最後に検出された順序になります。

      定義:
      インタフェースSequencedMap<K,V>内のputLast
      パラメータ:
      k - キー
      v - 値
      戻り値:
      以前kに関連付けられていた値。関連付けられていない場合はnull
      導入されたバージョン:
      21
    • 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
      戻り値:
      マップに含まれているキーのセット・ビュー
    • sequencedKeySet

      public SequencedSet<K> sequencedKeySet()
      このマップのkeySetSequencedSetビューを返します。

      返されるビューには、keySetメソッドによって返されるビューに指定されたものと同じ特性があります。

      定義:
      インタフェースSequencedMap<K,V>内のsequencedKeySet
      戻り値:
      このマップのkeySetSequencedSetビュー
      導入されたバージョン:
      21
    • values

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

      public SequencedCollection<V> sequencedValues()
      このマップのvaluesコレクションのSequencedCollectionビューを返します。

      返されるビューには、valuesメソッドによって返されるビューに指定されたものと同じ特性があります。

      定義:
      インタフェースSequencedMap<K,V>内のsequencedValues
      戻り値:
      このマップのvaluesコレクションのSequencedCollectionビュー
      導入されたバージョン:
      21
    • 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
      戻り値:
      マップ内に保持されているマッピングのセット・ビュー
    • sequencedEntrySet

      public SequencedSet<Map.Entry<K,V>> sequencedEntrySet()
      このマップのentrySetSequencedSetビューを返します。

      返されるビューには、entrySetメソッドによって返されるビューに指定されたものと同じ特性があります。

      定義:
      インタフェースSequencedMap<K,V>内のsequencedEntrySet
      戻り値:
      このマップのentrySetSequencedSetビュー
      導入されたバージョン:
      21
    • newLinkedHashMap

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

      public SequencedMap<K,V> reversed()
      このマップの逆順viewを返します。 返されるビューでのマッピングの検出順序は、このマップでのマッピングの検出順序の逆です。 逆の順序付けは、返されるビューのビュー・コレクションに含まれるすべての順序依存操作に影響します。 実装でこのビューの変更が許可されている場合は、基礎となるマップに"ライトスルー"が変更されます。 実装によっては、基礎となるマップに対する変更が、この逆方向ビューに表示される場合と表示されない場合があります。

      逆方向ビューおよびそのマップ・ビューに対する変更は許可され、このマップに伝播されます。 さらに、このマップに対する変更は、逆方向ビューとそのマップ・ビューに表示されます。

      定義:
      インタフェースSequencedMap<K,V>内のreversed
      戻り値:
      このマップの逆順ビュー
      導入されたバージョン:
      21