モジュール 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
関連項目: