クラス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