|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.util.AbstractMap | +--java.util.HashMap | +--java.util.LinkedHashMap
予測可能な繰り返し順序を持つ Map インタフェースのハッシュテーブルとリンクリストの実装です。この実装は、すべての実装のエントリを経る二重のリンクリストを保持するという点で、HashMap とは異なります。リンクリストは、繰り返し順序を定義します。この順序は、通常キーがマップに挿入された順序です (挿入順) 。キーをマップに「再挿入」する場合、挿入順は影響を受けません。呼び出しの直前に、s.contains(e) が true を返すときに m.put(k, v) が呼び出された場合、キーk がマップ m に再挿入されます。
この実装では、 TreeMap
関連の負担の増大を負わずに、HashMap
および Hashtable
による、無指定の一般には無秩序な順序からクライアントを守ります。この実装を使用して、当初のマップの実装にかかわらず、当初と同じ順序を持つマップのコピーを生成することができます。
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 に比べてそれほど結果はひどくはありません。
この実装は同期化されません。複数のスレッドが同時にリンクハッシュセットにアクセスし、それらのスレッドの少なくとも 1 つが構造的にマップを変更する場合には、外部で同期をとる必要があります。通常、構造的な変更は、マップを自然にカプセル化する特定のオブジェクトで同期をとることによって達成されます。そのようなオブジェクトがない場合には、Collections.synchronizedMap メソッドを使ってマップを「ラップ」する必要があります。偶発的な非同期アクセスを防ぐために、作成時にラップを行うのが最適です。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
構造的な変更は、 1 つまたは複数のマッピングを追加または削除し、リンクハッシュマップがアクセス順の場合は、繰り返しの順序に影響を与えるオペレーションです。リンクハッシュマップが挿入順の場合は、マップに格納済みのキーに関連する値を単に変更することは、構造の修正ではありません。リンクハッシュマップがアクセス順の場合は、get によりマップを単に照会することは、構造の変更になります。)
このクラスのすべてのコレクションビューメソッドによって返されるコレクションの iterator メソッドによって返される反復子は、「フェイルファスト」です。反復子の作成後に、反復子自体の remove メソッド以外の方法でマップが構造的に変更されると、反復子は ConcurrentModificationException をスローします。したがって、同時変更が行われると、反復子は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、直ちにかつ手際よく例外をスローします。
通常、非同期の同時変更がある場合、確かな保証を行うことは不可能なので、反復子のフェイルファストの動作を保証することはできません。フェイルファスト反復子は最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「反復子のフェイルファストの動作はバグを検出するためにのみ使用すべきです」
Object.hashCode()
,
Collection
,
Map
,
HashMap
,
TreeMap
,
Hashtable
,
直列化された形式入れ子クラスの概要 |
クラス java.util.Map から継承した入れ子クラス |
Map.Entry |
コンストラクタの概要 | |
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 m)
指定された Map と同じマッピングで挿入順の LinkedHashMap インスタンスを作成します。 |
メソッドの概要 | |
void |
clear()
すべてのマッピングをマップから削除します。 |
boolean |
containsValue(Object value)
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。 |
Object |
get(Object key)
マップが指定のキーをマップする値を返します。 |
protected boolean |
removeEldestEntry(Map.Entry 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 から継承したメソッド |
equals, hashCode |
コンストラクタの詳細 |
public LinkedHashMap(int initialCapacity, float loadFactor)
initialCapacity
- 初期容量loadFactor
- 負荷係数
IllegalArgumentException
- 初期容量が負であるか、負荷係数が正ではない場合public LinkedHashMap(int initialCapacity)
initialCapacity
- 初期容量
IllegalArgumentException
- 初期容量が負の場合public LinkedHashMap()
public LinkedHashMap(Map m)
m
- マッピングがこのマップに配置されるマップ
NullPointerException
- 指定されたマップが null の場合public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
initialCapacity
- 初期容量loadFactor
- 負荷係数accessOrder
- 順序モード。アクセス順なら true。挿入順ならfalse
IllegalArgumentException
- 初期容量が負であるか、負荷係数が正ではない場合メソッドの詳細 |
public boolean containsValue(Object value)
Map
内の containsValue
HashMap
内の containsValue
value
- マップにあるかどうかを判定される値
public Object get(Object key)
Map
内の get
HashMap
内の get
key
- 関連付けられた値が返されるキー
HashMap.put(Object, Object)
public void clear()
Map
内の clear
HashMap
内の clear
protected boolean removeEldestEntry(Map.Entry 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 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.