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が、LinkedHashMapを作成するために提供されています (反復の順序は、そのエントリがアクセスされた順序、つまり、もっとも過去にアクセスされたものから、もっとも新しくアクセスされたものへ(アクセス順))。この種のマップは、LRUキャッシュを構築するのに最適です。put、putIfAbsent、get、getOrDefault、compute、computeIfAbsent、computeIfPresentまたはmergeメソッドを呼び出すことは、対応するエントリにアクセスすることになります(呼出し完了後にそれが存在することを前提とする)。replaceメソッドは、値が置換されている場合にはエントリにアクセスするだけになります。putAllメソッドは、指定されたマップのエントリ・セット・イテレータによってキー値マッピングが提供される順序で、指定されたマップ内の各マッピングへの1回のアクセスを生成します。他のメソッドはエントリ・アクセスを生成しません。特に、コレクション・ビューに対する操作はバッキング・マップの反復順序に影響しません。
マップに新しいマッピングが追加されると、自動的に古いマッピングを削除するポリシーを適用するために、removeEldestEntry(Map.Entry)メソッドがオーバーライドされる場合があります。
このクラスは、任意のMapオペレーションをすべて提供し、null要素を許容します。HashMapと同じく、ハッシュ関数が複数のバケットに適切に要素を分散すると仮定して、基本のオペレーション(add、contains、およびremove)に一定時間のパフォーマンスを提供します。パフォーマンスは、1つの例外を除いて、リンク・リストを保持する負荷が増えるために、HashMapのパフォーマンスより少し劣る傾向があります。LinkedHashMapのコレクション・ビューの反復には、容量にかかわらず、マップのサイズに比例した時間が必要になります。容量に比例した時間を必要とするので、HashMapの反復はさらに負荷が大きくなる傾向があります。
リンク・ハッシュ・マップには、パフォーマンスに影響を及ぼすパラメータが2つあります。初期容量と負荷係数です。これらは、HashMapについて正確に定義されています。ただし、このクラスの反復回数は容量により影響を受けないので、初期容量に非常に高い値を選ぶことの負荷は、HashMapに比べて大きくはありません。
この実装はsynchronizedされません。複数のスレッドが並行してリンク・ハッシュ・マップにアクセスし、それらのスレッドの少なくとも1つが構造的にマップを変更する場合には、外部でsynchronizedする必要があります。これは通常、マップを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedMapメソッドを使用してマップを「ラップ」することをお薦めします。マップが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));構造的な変更は、1つまたは複数のマッピングを追加または削除するオペレーションです。アクセス順のリンク・ハッシュ・マップの場合は、反復順序に影響します。挿入順のリンク・ハッシュ・マップでは、すでにマップに含まれているキーに関連付けられた値を変更するだけの場合は、構造的な変更ではありません。アクセス順のLinkedHashMapでは、getでマップを照会することだけが構造的変更です。
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。フェイルファスト・イテレータは最善努力原則に基づき、ConcurrentModificationExceptionをスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、遅延バインディングおよびフェイルファストで、さらにSpliterator.ORDEREDを報告します。
このクラスは、Java Collections Frameworkのメンバーです。
Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, 直列化された形式AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>| コンストラクタと説明 |
|---|
LinkedHashMap()
デフォルトの初期容量(16)と負荷係数(0.75)を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
|
LinkedHashMap(int initialCapacity)
指定された初期容量とデフォルトの負荷係数(0.75)を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
|
LinkedHashMap(int initialCapacity, float loadFactor)
指定された初期容量と負荷係数を持つ、空の挿入順LinkedHashMapインスタンスを構築します。
|
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
指定された初期容量、負荷係数、および順序付けモードを持つ、空のLinkedHashMapインスタンスを構築します。
|
LinkedHashMap(Map<? extends K,? extends V> m)
指定されたマップと同じマッピングを持つ、挿入順のLinkedHashMapインスタンスを構築します。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
void |
clear()
すべてのマッピングをマップから削除します。
|
boolean |
containsValue(Object value)
マップが1つまたは複数のキーを指定された値にマッピングしている場合にtrueを返します。
|
Set<Map.Entry<K,V>> |
entrySet()
このマップに含まれるマッピングの
Setビューを返します。 |
void |
forEach(BiConsumer<? super K,? super V> action)
このマップのすべてのエントリの処理が完了するかアクションから例外がスローされるまで、各エントリに対して指定されたアクションを実行します。
|
V |
get(Object key)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合は
nullを返します。 |
V |
getOrDefault(Object key, V defaultValue)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合は
defaultValueを返します。 |
Set<K> |
keySet()
このマップに含まれるキーの
Setビューを返します。 |
protected boolean |
removeEldestEntry(Map.Entry<K,V> eldest)
このマップが一番古いエントリを削除するはずの場合にtrueを返します。
|
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
すべてのエントリが処理されるか、または関数が例外をスローするまで、各エントリの値を、そのエントリで指定された関数を呼び出した結果で置換します。
|
Collection<V> |
values()
このマップに含まれる値の
Collectionビューを返します。 |
clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, sizeequals, hashCode, toStringcompute, computeIfAbsent, computeIfPresent, containsKey, equals, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, sizepublic LinkedHashMap(int initialCapacity,
float loadFactor)
initialCapacity - 初期容量loadFactor - 負荷係数IllegalArgumentException - 初期容量が負であるか、負荷係数が正でない場合public LinkedHashMap(int initialCapacity)
initialCapacity - 初期容量IllegalArgumentException - 初期容量が負の場合public LinkedHashMap()
public LinkedHashMap(Map<? extends K,? extends V> m)
m - マッピングがこのマップに配置されるマップNullPointerException - 指定されたマップがnullの場合public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder)
initialCapacity - 初期容量loadFactor - 負荷係数accessOrder - 順序付けモード - アクセス順ならtrue。挿入順ならfalseIllegalArgumentException - 初期容量が負であるか、負荷係数が正でない場合public boolean containsValue(Object value)
containsValue、インタフェース: Map<K,V>containsValue、クラス: HashMap<K,V>value - このマップにあるかどうかが判定される値public V get(Object key)
nullを返します。
つまり、このメソッドは、(key==null ? k==null : key.equals(k))となるキーkから値vへのマッピングがこのマップに含まれている場合はvを返し、それ以外の場合はnullを返します。(このようなマッピングは1つのみ存在できます。)
戻り値nullは、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnullにマップすることもあります。containsKeyオペレーションを使うと、これらの2つの場合を区別できます。
public V getOrDefault(Object key, V defaultValue)
defaultValueを返します。getOrDefault、インタフェース: Map<K,V>getOrDefault、クラス: HashMap<K,V>key - 関連付けられた値が返されるキーdefaultValue - キーのデフォルト・マッピングdefaultValuepublic void clear()
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
サンプル使用: このオーバーライドにより、マップはエントリを最大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呼出しが行われる前にマップが空であった場合、これは挿入されたばかりのエントリになる。つまり、マップに単一のエントリが含まれている場合、もっとも古いエントリはもっとも新しいエントリでもある。public Set<K> keySet()
Setビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。public Collection<V> values()
Collectionビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。コレクションは要素の削除をサポートします。Iterator.remove、Collection.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。public Set<Map.Entry<K,V>> entrySet()
Setビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。そのSpliteratorは通常、HashMapより高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。public void forEach(BiConsumer<? super K,? super V> action)
Mappublic void replaceAll(BiFunction<? super K,? super V,? extends V> function)
MapreplaceAll、インタフェース: Map<K,V>replaceAll、クラス: HashMap<K,V>function - 各エントリに適用する関数 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.