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
が、リンクハッシュマップを作成するために用意されています。その反復順序は、エントリがアクセスされた順序 (もっとも前にアクセスされたものから、もっとも後にアクセスしたものへ (アクセス順)) です。この種のマップは、LRU キャッシュを構築するのに最適です。put または get メソッドを呼び出すと、対応するエントリにアクセスします (呼び出し完了後にそれがあると仮定します)。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
をスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
イテレータのフェイルファスト動作は実際には保証できません。一般的に、synchronized なしの並行変更がある場合、確実に保証することは不可能です。フェイルファストイテレータは、ベストエフォートベースで ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファスト動作はバグを検出するためにのみ使用すべきです。
このクラスは、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 を返します。
|
V |
get(Object key)
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合は
null を返します。 |
protected boolean |
removeEldestEntry(Map.Entry<K,V> eldest)
このマップが一番古いエントリを削除するはずの場合に true を返します。
|
clone, containsKey, entrySet, isEmpty, keySet, put, putAll, remove, size, values
equals, hashCode, toString
public 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 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 呼び出しが行われる前にマップが空であった場合、これは挿入されたばかりのエントリになる。つまり、マップに単一のエントリが含まれている場合、もっとも古いエントリはもっとも新しいエントリでもある。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.