- 型パラメータ:
K
- このマップで保持されるキーの型V
- マップされる値の型
- すべての実装されたインタフェース:
Serializable
,Cloneable
,Map<K,
V>
予測可能な反復順序を持つMap
インタフェースのハッシュ表とリンク・リストの実装です。 この実装は、すべてのエントリをまたがる二重のリンク・リストを保持するという点で、HashMap
とは異なります。 このリンク・リストは、反復順序を定義します。この順序は通常、キーがマップに挿入された順序です(挿入順)。 キーがマップに再挿入されても、挿入順は影響を受けません。 m.put(k, v)
が呼び出された場合、呼出しの直前にm.containsKey(k)
がtrue
を返しても、キーk
がマップm
に再挿入されます。
この実装では、HashMap
およびHashtable
で提供される未指定(無秩序)の順序がクライアントで起きることはありません(TreeMap
のように負荷が増えることもありません)。 この実装を使用することで、元のマップの実装にかかわらず、元のマップと同じ順序のコピーを作成できます。
void foo(Map<String, Integer> m) {
Map<String, Integer> copy = new LinkedHashMap<>(m);
...
}
この技術は、モジュールが入力としてマップを取り、それをコピーし、順序がコピーの順序で決まる結果を返す場合に、特に役立ちます。 (クライアントは一般的に、渡された順序で返されることを想定します。)
特別なconstructor
が、リンク・ハッシュ・マップを作成するために提供されています (反復の順序は、そのエントリがアクセスされた順序、つまり、もっとも過去にアクセスされたものから、もっとも新しくアクセスされたものへ(アクセス順))。 この種のマップは、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つまたは複数のマッピングを追加または削除するオペレーションです。アクセス順のリンク・ハッシュ・マップの場合は、反復順序に影響します。 挿入順のリンク・ハッシュ・マップでは、すでにマップに含まれているキーに関連付けられた値を変更するだけの場合は、構造的な変更ではありません。 アクセス順のリンク・ハッシュ・マップでは、
get
でマップを照会することだけが構造的変更です。
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiterator
メソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremove
メソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationException
をスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationException
をスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、遅延バインディングおよびフェイルファストで、さらにSpliterator.ORDERED
を報告します。
このクラスは、Java Collections Frameworkのメンバーです。
- 実装上のノート:
- このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのスプリッテレータ・メソッドによって返されるスプリッテレータは、対応するコレクションのイテレータから作成されます。
- 導入されたバージョン:
- 1.4
- 関連項目:
-
ネストされたクラスのサマリー
クラス java.util.AbstractMapで宣言されたネストされたクラス/インタフェース
AbstractMap.SimpleEntry<K,
V>, AbstractMap.SimpleImmutableEntry<K, V> -
コンストラクタのサマリー
コンストラクタコンストラクタ説明デフォルトの初期容量(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
を返します。entrySet()
このマップに含まれるマッピングのSet
ビューを返します。指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnull
を返します。keySet()
このマップに含まれるキーのSet
ビューを返します。protected boolean
removeEldestEntry
(Map.Entry<K, V> eldest) このマップが一番古いエントリを削除するはずの場合にtrue
を返します。values()
このマップに含まれる値のCollection
ビューを返します。クラス java.util.HashMapで宣言されたメソッド
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, remove, size
クラス java.util.AbstractMapで宣言されたメソッド
equals, hashCode, toString
インタフェース java.util.Mapで宣言されたメソッド
compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size
-
コンストラクタの詳細
-
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor) 指定された初期容量と負荷係数を持つ、空の挿入順LinkedHashMap
インスタンスを構築します。- パラメータ:
initialCapacity
- 初期容量loadFactor
- 負荷係数- throws:
IllegalArgumentException
- 初期容量が負であるか、負荷係数が正でない場合
-
LinkedHashMap
public LinkedHashMap(int initialCapacity) 指定された初期容量とデフォルトの負荷係数(0.75)を持つ、空の挿入順LinkedHashMap
インスタンスを構築します。- パラメータ:
initialCapacity
- 初期容量- throws:
IllegalArgumentException
- 初期容量が負の場合
-
LinkedHashMap
public LinkedHashMap()デフォルトの初期容量(16)と負荷係数(0.75)を持つ、空の挿入順LinkedHashMap
インスタンスを構築します。 -
LinkedHashMap
指定されたマップと同じマッピングを持つ、挿入順のLinkedHashMap
インスタンスを構築します。LinkedHashMap
インスタンスは、デフォルトの負荷係数(0.75)、および指定されたマップでマッピングを保持するのに十分な初期容量で作成されます。- パラメータ:
m
- マッピングがこのマップに配置されるマップ- throws:
NullPointerException
- 指定されたマップがnullの場合
-
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 指定された初期容量、負荷係数、および順序付けモードを持つ、空のLinkedHashMap
インスタンスを構築します。- パラメータ:
initialCapacity
- 初期容量loadFactor
- 負荷係数accessOrder
- 順序付けモード - アクセス順ならtrue
。挿入順ならfalse
- throws:
IllegalArgumentException
- 初期容量が負であるか、負荷係数が正でない場合
-
-
メソッドの詳細
-
containsValue
public boolean containsValue(Object value) このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrue
を返します。- 定義:
- インタフェース
Map<K,
内のV> containsValue
- オーバーライド:
- クラス
HashMap<K,
のV> containsValue
- パラメータ:
value
- このマップにあるかどうかが判定される値- 戻り値:
- このマップが1つまたは複数のキーを指定された値にマッピングしている場合は
true
-
get
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnull
を返します。つまり、このメソッドは、
(key==null ? k==null : key.equals(k))
となるキーk
から値v
へのマッピングがこのマップに含まれている場合はv
を返し、それ以外の場合はnull
を返します。 (このようなマッピングは1つのみ存在できます。)戻り値
null
は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnull
にマップすることもあります。containsKey
操作を使うと、これら2つのケースを見分けることができます。 -
clear
public void clear()すべてのマッピングをマップから削除します。 この呼出しが戻ると、マップは空になります。 -
removeEldestEntry
このマップが一番古いエントリを削除するはずの場合に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
- もっとも以前にマップに挿入されたエントリ。これがアクセス順マップの場合は、もっとも以前にアクセスされたエントリ。 これは、このメソッドがtrue
を返した場合に削除されるエントリである。 この呼出しの原因となったput
またはputAll
呼出しが行われる前にマップが空であった場合、これは挿入されたばかりのエントリになる。つまり、マップに単一のエントリが含まれている場合、もっとも古いエントリはもっとも新しいエントリでもある。- 戻り値:
- もっとも古いエントリをマップから削除すべき場合は
true
。そのエントリを保持すべき場合はfalse
。
-
keySet
このマップに含まれるキーのSet
ビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremove
オペレーションを除く)。 セットは要素の削除をサポートします。Iterator.remove
、Set.remove
、removeAll
、retainAll
、およびclear
オペレーションで対応するマッピングをマップから削除します。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。 -
values
public Collection<V> values()このマップに含まれる値のCollection
ビューを返します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremove
オペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove
、Collection.remove
、removeAll
、retainAll
、およびclear
オペレーションを通して行います。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。 -
entrySet
このマップに含まれるマッピングのSet
ビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremove
オペレーション、またはイテレータにより返されるマップ・エントリに対するsetValue
オペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove
、Set.remove
、removeAll
、retainAll
、およびclear
オペレーションを通して行います。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。
-