|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.util.AbstractMap<K,V>
java.util.HashMap<K,V>
java.util.LinkedHashMap<K,V>
K - このマップで保持されるキーの型V - マップされる値の型public class LinkedHashMap<K,V>
予測可能な繰り返し順序を持つ Map インタフェースのハッシュテーブルとリンクリストの実装です。この実装は、すべての実装のエントリを経る二重のリンクリストを保持するという点で、HashMap とは異なります。リンクリストは、繰り返し順序を定義します。 この順序は、通常キーがマップに挿入された順序です (挿入順) 。キーをマップに「再挿入」する場合、挿入順は影響を受けません。呼び出しの直前に、m.containsKey(k) が true を返すときに m.put(k, v) が呼び出された場合、キー k がマップ m に再挿入されます。
この実装では、TreeMap 関連の負担の増大を負わずに、HashMap および Hashtable による、無指定された一般には無秩序な順序からクライアントを守ります。この実装を使用して、当初のマップの実装にかかわらず、当初と同じ順序を持つマップのコピーを生成することができます。
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
モジュールが入力のマップを取得し、コピーして、コピーのマップが設定した順序の結果を返した場合、この技術は特に役立ちます。一般的に、クライアントは提示と同じ順序で返されることを評価します。
特別なコンストラクタが、リンクハッシュマップ作成のため提供されます。 このマップの繰り返し順序は、最後にエントリにアクセスした順序になります。 順序はもっとも前にアクセスしたものから始まり、もっとも後にアクセスしたもので終わります (アクセス順)。この種のマップは、LRU キャッシュを構築するのに最適です。put または get メソッドを呼び出すと、対応するエントリにアクセスしたことになります (呼び出し完了後に、対応するエントリがあると仮定します)。putAll メソッドは、指定されたマップのエントリセット反復子により提供されるキー値マッピングの順序で、各マッピングのエントリアクセスを 1 回発生させます。エントリアクセスを発生させるメソッドは他にありません。特にコレクションビューに対するオペレーションは、元になるマップの繰り返し順序には影響を与えません。
マップに新しいマッピングを追加するとき、自動的に無効なマッピングを削除するポリシーを規定するために、removeEldestEntry(Map.Entry) メソッドがオーバーライドされる場合があります。
このクラスは、オプションの Map オペレーションをすべて提供し、null 要素を許容します。HashMap と同じく、ハッシュ関数が複数のバケットに適切に要素を分散すると仮定して、基本のオペレーション (add、contains、および remove) に一定時間のパフォーマンスを提供します。パフォーマンスは、1 つの例外を除いて、リンクリストを保持する負担の増大により、HashMap のパフォーマンスより少し劣る場合があります。LinkedHashMap のコレクションビューの繰り返しには、容量にかかわらず、マップの「サイズ」に比例した時間が必要になります。「容量」に比例した時間を必要とするので、HashMap の繰り返しは、いっそう高くつくおそれがあります。
リンクハッシュマップには、パフォーマンスに影響を及ぼすパラメータが 2 つあります。「初期容量」と「負荷係数」です。これらのパラメータは、HashMap について正確に定義されています。ただし、このクラスの繰り返し回数は容量により影響を受けないので、初期容量に非常に高い値を選んでも、このクラスでは HashMap に比べてそれほど結果はひどくはありません。
この実装は同期化されません。複数のスレッドが並行してリンクハッシュセットにアクセスし、それらのスレッドの少なくとも 1 つが構造的にマップを変更する場合には、外部で同期をとる必要があります。通常、構造的な変更は、マップを自然にカプセル化する特定のオブジェクトで同期をとることによって達成されます。
この種のオブジェクトがない場合には、Collections.synchronizedMap メソッドを使用してマップを「ラップ」する必要があります。マップへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));構造的な変更は、 1 つまたは複数のマッピングを追加または削除し、リンクハッシュマップがアクセス順の場合は、繰り返しの順序に影響を与えるオペレーションです。リンクハッシュマップが挿入順の場合は、マップに格納済みのキーに関連する値を単に変更することは、構造の修正ではありません。リンクハッシュマップがアクセス順の場合は、get によりマップを単に照会することは、構造の変更になります。
このクラスのすべてのコレクションビューメソッドによって返されるコレクションの iterator メソッドによって返される反復子は、「フェイルファスト」です。反復子の作成後に、反復子自体の remove メソッド以外の方法でマップが構造的に変更されると、反復子は ConcurrentModificationException をスローします。このように、並行して変更が行われると、反復子は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、反復子のフェイルファストの動作を保証することはできません。フェイルファスト反復子は最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「反復子のフェイルファストの動作はバグを検出するためにのみ使用すべきです」。
このクラスは、Java Collections Framework のメンバーです。
Object.hashCode(),
Collection,
Map,
HashMap,
TreeMap,
Hashtable,
直列化された形式| 入れ子のクラスの概要 |
|---|
| クラス java.util.AbstractMap から継承された入れ子のクラス/インタフェース |
|---|
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)
指定された Map と同じマッピングで挿入順の LinkedHashMap インスタンスを作成します。 |
|
| メソッドの概要 | |
|---|---|
void |
clear()
すべてのマッピングをマップから削除します。 |
boolean |
containsValue(Object value)
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。 |
V |
get(Object key)
指定されたキーがマップされている値を返します。 |
protected boolean |
removeEldestEntry(Map.Entry<K,V> eldest)
このマップが一番古いエントリを削除する場合、true を返します。 |
| クラス java.util.HashMap から継承されたメソッド |
|---|
clone, containsKey, entrySet, isEmpty, keySet, put, putAll, remove, size, values |
| クラス java.util.AbstractMap から継承されたメソッド |
|---|
equals, hashCode, toString |
| クラス java.lang.Object から継承されたメソッド |
|---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
| インタフェース java.util.Map から継承されたメソッド |
|---|
containsKey, entrySet, equals, hashCode, isEmpty, keySet, put, putAll, remove, size, values |
| コンストラクタの詳細 |
|---|
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。挿入順ならfalse
IllegalArgumentException - 初期容量が負であるか負荷係数が正でない場合| メソッドの詳細 |
|---|
public boolean containsValue(Object value)
Map<K,V> 内の containsValueHashMap<K,V> 内の containsValuevalue - マップにあるかどうかを判定される値
public V get(Object key)
null を返します。
つまり、このメソッドは、(key==null ? k==null : key.equals(k)) となるキー k から値 v へのマッピングがこのマップに含まれている場合は v を返し、それ以外の場合は null を返します。このようなマッピングが 1 つだけあります。
戻り値の null は、マップがキーのマッピングを保持していないことを示すとはかぎりません。 つまり、マップが明示的にキーを null にマップすることもあります。containsKey オペレーションを使うと、この 2 つの場合を区別できます。
Map<K,V> 内の getHashMap<K,V> 内の getkey - 関連付けられた値が返されるキー
nullHashMap.put(Object, Object)public void clear()
Map<K,V> 内の clearHashMap<K,V> 内の clearprotected 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 呼び出しが行われる前にマップが空であった場合、これは挿入されたばかりのエントリになる。つまり、マップに単一のエントリが含まれている場合、もっとも古いエントリはもっとも新しいエントリでもある
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。