モジュール java.base
パッケージ java.util

クラスWeakHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.WeakHashMap<K,V>
型パラメータ:
K - このマップで保持されるキーの型
V - マップされる値の型
すべての実装されたインタフェース:
Map<K,V>

public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
「弱いキー」を使用したMapインタフェースのハッシュ表ベースの実装。 WeakHashMap内のエントリは、そのキーが通常の使用でなくなったときに自動的に削除されます。 より正確には、指定されたキーのマッピングが存在しても、ガベージ・コレクタがキーを破棄するのを防ぐことはできません。つまりガベージ・コレクタが、そのキーをファイナライズ可能にし、ファイナライズしてから回収するのを防ぐことはできません。 キーが破棄されると、そのエントリがマップから効果的に削除されるため、このクラスは他のMap実装とは若干異なる動作をします。

null値とnullキーはどちらもサポートされています。 このクラスには、HashMapクラスのパフォーマンス特性に類似したパフォーマンス特性があり、「初期容量」および「負荷率」の効率パラメータが同じです。

ほとんどのコレクション・クラスと同じように、このクラスは同期化されていません。 同期化されたWeakHashMapは、Collections.synchronizedMapメソッドを使用して構築できます。

このクラスは主に、equalsメソッドが==演算子を使用してオブジェクト・アイデンティティをテストするキー・オブジェクトで使用することを目的としています。 このようなキーを破棄すると、再作成できなくなるため、あとでWeakHashMap内でそのキーをルックアップすることは不可能で、そのエントリが削除されたことに驚きます。 このクラスは、equalsメソッドがStringインスタンスなどのオブジェクト・アイデンティティに基づいていないキー・オブジェクトと完全に連携します。 ただし、このような再利用可能なキー・オブジェクトでは、キーが破棄されたWeakHashMapエントリの自動削除は、混乱している可能性があります。

WeakHashMapクラスの動作は、ガベージ・コレクタのアクションによって一部異なるため、慣れ親しんだいくつかの(必須ではありませんが) Map不変は、このクラスでは保持されません。 ガベージ・コレクタはいつでもキーを破棄できるため、WeakHashMapは、不明なスレッドがエントリを暗黙的に削除しているかのように動作する可能性があります。 特に、WeakHashMapインスタンスで同期し、そのミューテータ・メソッドを呼び出さない場合でも、isEmptyメソッドがfalseを返し、trueを返すため、containsKeyメソッドがtrueを返し、その後getメソッドに対してfalseを返すように、sizeメソッドが時間の経過とともに小さい値を返すことができます。putメソッドがnullを返し、removeメソッドがfalseを戻して、以前マップに現れたキーを返し、キー・セット、値コレクションおよびエントリ・セットを連続して調べると、要素の数が連続して小さくなるように、nullを返します。

WeakHashMap内の各キー・オブジェクトは、弱い参照の参照として間接的に格納されます。 このため、キーは、それに対する弱参照がマップの内外ともにガベージ・コレクタによってクリアされてからのみ自動的に削除されます。

実装に関するノート: WeakHashMap内の値オブジェクトは、通常の強力な参照によって保持されます。 このため、値のオブジェクトが直接的にも間接的にも強くそれ自体のキーを参照しないようにしてください。そうすれば、キーが破棄されないようになります。 値オブジェクトは、WeakHashMap自体を介してキーに間接的に参照される場合があります。つまり、値オブジェクトは、関連付けられた値オブジェクトを持つ他のキー・オブジェクトを強く参照し、次に、最初の値オブジェクトのキーを強く参照する場合があります。 マップ内の値が、それらへの強い参照を保持しているマップに依存していない場合、これに対処する1つの方法は、挿入する前にWeakReferences内で値をラップすることです: m.put(key, new WeakReference(value))、および各getのアン・ラップ。

このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiteratorメソッドによって返されるイテレータは、フェイルファストです。 イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。

通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

このクラスは、Java Collections Frameworkのメンバーです。

導入されたバージョン:
1.2
関連項目: