- 型パラメータ:
K
- このマップで保持されるキーの型V
- マップされる値の型
- すべての実装されたインタフェース:
Serializable
,Cloneable
,Map<K,
,V> 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キャッシュを構築するのに最適です。 put
、putIfAbsent
、get
、getOrDefault
、compute
、computeIfAbsent
、computeIfPresent
またはmerge
メソッドを呼び出すことは、対応するエントリにアクセスすることになります(呼出し完了後にそれが存在することを前提とする)。 replace
メソッドは、値が置換されている場合にはエントリにアクセスするだけになります。 putAll
メソッドは、指定されたマップのエントリ・セット・イテレータによってキー値マッピングが提供される順序で、指定されたマップ内の各マッピングへの1回のアクセスを生成します。 他のメソッドはエントリ・アクセスを生成しません。 逆仕訳済ビューでこれらのメソッドを起動すると、バッキング・マップのエントリへのアクセスが生成されます。 逆方向ビューでは、エントリにアクセスすると、エントリが最初に出現順に移動することに注意してください。 putFirst
やlastEntry
などの明示的な配置メソッドは、マップ上か逆順のビュー上かに関係なく、配置操作を実行し、エントリ・アクセスを生成しません。 keySet
、values
およびentrySet
ビューに対する操作、または順序付けされた対応する操作が、バッキング・マップの発生順序に影響しません。
マップに新しいマッピングが追加されると、自動的に古いマッピングを削除するポリシーを適用するために、removeEldestEntry(Map.Entry)
メソッドがオーバーライドされる場合があります。 または、"長老"エントリが出現順に最初のエントリであるため、プログラムはfirstEntry
およびpollFirstEntry
メソッドを使用して古いマッピングを検査および削除できます。
このクラスは、オプションのMap
およびSequencedMap
操作をすべて提供し、null要素を許可します。 HashMap
と同様、ハッシュ関数がバケット間で要素を適切に分散すると、基本操作(add
、contains
および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
- 関連項目:
-
ネストされたクラスのサマリー
クラス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
ビューを返します。static <K,
V> LinkedHashMap <K, V> newLinkedHashMap
(int numMappings) 予想されるマッピング数に適した、新しい空の挿入順序のLinkedHashMapを作成します。指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。protected boolean
removeEldestEntry
(Map.Entry<K, V> eldest) このマップが最長のエントリを削除する必要がある場合、true
を返します。reversed()
このマップの逆順viewを返します。このマップのentrySet
のSequencedSet
ビューを返します。このマップのkeySet
のSequencedSet
ビューを返します。このマップのvalues
コレクションのSequencedCollection
ビューを返します。values()
このマップに含まれる値のCollection
ビューを返します。クラスjava.util.HashMapで宣言されたメソッド
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, 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
インタフェースjava.util.SequencedMapで宣言されたメソッド
firstEntry, lastEntry, pollFirstEntry, pollLastEntry
-
コンストラクタの詳細
-
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
指定したマップと同じマッピングを使用して、挿入順序のLinkedHashMap
インスタンスを構築します。LinkedHashMap
インスタンスは、デフォルトのロード・ファクタ(0.75)と、指定したマップにマッピングを保持するのに十分な初期容量で作成されます。- パラメータ:
m
- マッピングがこのマップに配置されるマップ- 例外:
NullPointerException
- 指定されたマップがnullの場合
-
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 指定された初期容量、負荷係数および順序付けモードで空のLinkedHashMap
インスタンスを構築します。- パラメータ:
initialCapacity
- 初期容量loadFactor
- 負荷係数accessOrder
- 順序付けモード -true
(アクセス順序)、false
(挿入順序)- 例外:
IllegalArgumentException
- 初期容量が負であるか、負荷係数が正でない場合
-
-
メソッドの詳細
-
putFirst
指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。 この操作が正常に完了すると、指定されたマッピングがこのマップに存在し、このマップの出現順序の最初のマッピングになります。このマップにこのキーのマッピングがすでに含まれている場合、マッピングは必要に応じて再配置され、最初に検出された順序になります。
- 定義:
- インタフェース
SequencedMap<K,
内のV> putFirst
- パラメータ:
k
- キーv
- 値- 戻り値:
- 以前kに関連付けられていた値。関連付けられていない場合はnull
- 導入されたバージョン:
- 21
-
putLast
指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。 この操作が正常に完了すると、指定されたマッピングがこのマップに存在し、このマップの出現順序の最後のマッピングになります。このマップにこのキーのマッピングがすでに含まれている場合は、必要に応じてマッピングが再配置され、最後に検出された順序になります。
- 定義:
- インタフェース
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
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnull
を返します。つまり、このメソッドは、
(key==null ? k==null : key.equals(k))
となるキーk
から値v
へのマッピングがこのマップに含まれている場合はv
を返し、それ以外の場合はnull
を返します。 (このようなマッピングは1つのみ存在できます。)戻り値
null
は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnull
にマップすることもあります。containsKey
操作を使うと、これら2つのケースを見分けることができます。 -
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要素は削除されません)を返します。- パラメータ:
eldest
- もっとも以前にマップに挿入されたエントリ。これがアクセス順マップの場合は、もっとも以前にアクセスされたエントリ。 これは、このメソッドがtrue
を返す場合に削除されるエントリです。put
またはputAll
呼出しの前にマップが空で、この呼出しが発生した場合、これは挿入されたエントリになります。つまり、マップに1つのエントリが含まれている場合、最も古いエントリも最新になります。- 戻り値:
- 最も古いエントリをマップから削除する場合は
true
、保持する場合はfalse
。
-
keySet
このマップに含まれるキーのSet
ビューを返します。 ビュー内のキーが出現する順序は、このマップのマッピングの順序と一致します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremove
オペレーションを除く)。 セットは要素の削除をサポートします。Iterator.remove
、Set.remove
、removeAll
、retainAll
、およびclear
オペレーションで対応するマッピングをマップから削除します。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。 -
sequencedKeySet
public SequencedSet<K> sequencedKeySet()- 定義:
- インタフェース
SequencedMap<K,
内のV> sequencedKeySet
- 戻り値:
- このマップの
keySet
のSequencedSet
ビュー - 導入されたバージョン:
- 21
-
values
public Collection<V> values()このマップに含まれる値のCollection
ビューを返します。 ビュー内の値の検出順序は、このマップ内のエントリの検索順序に一致します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremove
オペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove
、Collection.remove
、removeAll
、retainAll
、およびclear
オペレーションを通して行います。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。 -
sequencedValues
public SequencedCollection<V> sequencedValues()- 定義:
- インタフェース
SequencedMap<K,
内のV> sequencedValues
- 戻り値:
- このマップの
values
コレクションのSequencedCollection
ビュー - 導入されたバージョン:
- 21
-
entrySet
このマップに含まれるマッピングのSet
ビューを返します。 ビューの検索順序は、このマップのエントリの検索順序に一致します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremove
オペレーション、またはイテレータにより返されるマップ・エントリに対するsetValue
オペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove
、Set.remove
、removeAll
、retainAll
、およびclear
オペレーションを通して行います。add
またはaddAll
操作はサポートされていません。 そのSpliterator
は通常、HashMap
より高速な順次パフォーマンスを提供しますが、並列パフォーマンスは大幅に低下します。 -
sequencedEntrySet
public SequencedSet<Map.Entry<K,V>> sequencedEntrySet()- 定義:
- インタフェース
SequencedMap<K,
内のV> sequencedEntrySet
- 戻り値:
- このマップの
entrySet
のSequencedSet
ビュー - 導入されたバージョン:
- 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
-