- 型パラメータ:
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内のそのキーの検索を行って、そのエントリが削除されていたことに驚くような事態は起こり得ません。 このクラスは、Stringインスタンスなどのオブジェクト識別情報に基づかないequalsメソッドを持つキー・オブジェクトも適切に処理します。 ただし、そのような作り直し可能なキー・オブジェクトでは、すでにキーが破棄されたWeakHashMapエントリの自動的な削除によって、混乱が生じる場合があります。
WeakHashMapクラスの動作の一部はガベージ・コレクタのアクションに依存するので、よく知られていても必要ではない、いくつかのMapインバリアントはこのクラスに適しません。 ガベージ・コレクタはキーをいつでも破棄できるので、WeakHashMapは未知のスレッドが通知なしでエントリを削除中であるかのように動作します。 特に、WeakHashMapインスタンス上で同期をとり、その変更用メソッドのどれも呼び出さない場合でも、sizeメソッドはより小さな値を時間の経過とともに返すことがあります。isEmptyメソッドはfalseを返してからtrueを返すことがあります。containsKeyメソッドは、指定されたキーに対してtrueを返したあとでfalseを返すことがあります。getメソッドは、指定されたキーの値を返したあとでnullを返すことがあります。putメソッドとremoveメソッドは、以前マップにあるように見えたキーに対してそれぞれnullとfalseを返すことがあります。キー・セット、値コレクション、エントリ・セットを連続して検査すると、出力される要素の数が少なくなっていくことがあります。
WeakHashMap内の各キー・オブジェクトは弱参照のリファレントとして間接的に格納されています。 このため、キーは、それに対する弱参照がマップの内外ともにガベージ・コレクタによってクリアされてからのみ自動的に削除されます。
実装にあたっての注意: WeakHashMap内の値オブジェクトは、通常の強参照によって保持されます。 このため、値のオブジェクトが直接的にも間接的にも強くそれ自体のキーを参照しないようにしてください。そうすれば、キーが破棄されないようになります。 値オブジェクトはWeakHashMap自体を介してそのキーを間接的に参照できることに注意してください。つまり、値オブジェクトがほかのキー・オブジェクトを強く参照し、それに関連付けられている値オブジェクトが今度は最初の値オブジェクトのキーを強く参照することがあります。 マップ内の値が、それらへの強参照を保持するマップに依存していない場合、これに対処する方法の1つは、m.put(key, new WeakReference(value))のように、値自体をWeakReferences内にラップした後で挿入することです。そして、getを呼び出すたびにそのラップを解除します。
このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。
このクラスは、Java Collections Frameworkのメンバーです。
- 導入されたバージョン:
- 1.2
- 関連項目:
HashMap,WeakReference
-
ネストされたクラスのサマリー
クラス java.util.AbstractMapで宣言されたネストされたクラス/インタフェース
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V> -
コンストラクタのサマリー
コンストラクタ コンストラクタ 説明 WeakHashMap()デフォルトの初期容量(16)と負荷係数(0.75)を持つ、新しい空のWeakHashMapを作成します。WeakHashMap(int initialCapacity)指定された初期容量とデフォルトの負荷係数(0.75)を持つ、新しい空のWeakHashMapを作成します。WeakHashMap(int initialCapacity, float loadFactor)指定された初期容量と指定された負荷係数を持つ、新しい空のWeakHashMapを作成します。WeakHashMap(Map<? extends K,? extends V> m)指定されたマップと同じマッピングを持つ、新しいWeakHashMapを構築します。 -
メソッドのサマリー
修飾子と型 メソッド 説明 voidclear()すべてのマッピングをマップから削除します。booleancontainsKey(Object key)指定されたキーのマッピングがこのマップに含まれている場合にtrueを返します。booleancontainsValue(Object value)このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。Set<Map.Entry<K,V>>entrySet()このマップに含まれるマッピングのSetビューを返します。Vget(Object key)指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。booleanisEmpty()このマップがキーと値のマッピングを保持しない場合にtrueを返します。Set<K>keySet()このマップに含まれるキーのSetビューを返します。Vput(K key, V value)指定された値と指定されたキーをこのマップに関連付けます。voidputAll(Map<? extends K,? extends V> m)指定されたマップからすべてのマッピングをマップにコピーします。Vremove(Object key)キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。intsize()このマップ内のキー値マッピングの数を返します。Collection<V>values()このマップに含まれる値のCollectionビューを返します。インタフェース java.util.Mapで宣言されたメソッド
compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
-
コンストラクタの詳細
-
WeakHashMap
public WeakHashMap(int initialCapacity, float loadFactor)指定された初期容量と指定された負荷係数を持つ、新しい空のWeakHashMapを作成します。- パラメータ:
initialCapacity-WeakHashMapの初期容量loadFactor-WeakHashMapの負荷係数- 例外:
IllegalArgumentException-初期容量が負の場合、または負荷係数が正でない場合。
-
WeakHashMap
public WeakHashMap(int initialCapacity)指定された初期容量とデフォルトの負荷係数(0.75)を持つ、新しい空のWeakHashMapを作成します。- パラメータ:
initialCapacity-WeakHashMapの初期容量- 例外:
IllegalArgumentException- 初期容量が負の場合
-
WeakHashMap
public WeakHashMap()デフォルトの初期容量(16)と負荷係数(0.75)を持つ、新しい空のWeakHashMapを作成します。 -
WeakHashMap
指定されたマップと同じマッピングを持つ、新しいWeakHashMapを構築します。WeakHashMapは、デフォルトの負荷係数(0.75)、および指定されたマップのマッピングを保持するのに十分な初期容量で作成されます。- パラメータ:
m- マッピングがこのマップに配置されるマップ- 例外:
NullPointerException- 指定されたマップがnullの場合- 導入されたバージョン:
- 1.3
-
-
メソッドの詳細
-
size
public int size()このマップ内のキー値マッピングの数を返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。 -
isEmpty
public boolean isEmpty()このマップがキーと値のマッピングを保持しない場合にtrueを返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。 -
get
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。より正式には、このマップにキー
kからObjects.equals(key, k)のような値vへのマッピングが含まれている場合、このメソッドはvを返します; それ以外の場合は、nullを返します。 このようなマッピングは1つのみ存在できます。戻り値
nullは、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnullにマップすることもあります。containsKey操作を使うと、これら2つのケースを見分けることができます。- 定義:
- インタフェース
Map<K,V>内のget - オーバーライド:
- クラス
AbstractMap<K,V>のget - パラメータ:
key- 関連付けられた値が返されるキー- 戻り値:
- 指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合は
null - 関連項目:
put(Object, Object)
-
containsKey
public boolean containsKey(Object key)指定されたキーのマッピングがこのマップに含まれている場合にtrueを返します。- 定義:
- インタフェース
Map<K,V>内のcontainsKey - オーバーライド:
- クラス
AbstractMap<K,V>のcontainsKey - パラメータ:
key- このマップ内にあるかどうかが判定されるキー- 戻り値:
keyに対するマッピングがある場合はtrue、そうでない場合はfalse
-
put
指定された値と指定されたキーをこのマップに関連付けます。 マップが以前にこのキーのマッピングを保持していた場合、古い値が置き換えられます。 -
putAll
指定されたマップからすべてのマッピングをマップにコピーします。 これにより、マップが指定されたマップ内に現在あるキーのすべてに対して持っていたマッピングが置き換えられます。- 定義:
- インタフェース
Map<K,V>内のputAll - オーバーライド:
- クラス
AbstractMap<K,V>のputAll - パラメータ:
m- このマップに格納されるマッピング。- 例外:
NullPointerException- 指定されたマップがnullの場合。
-
remove
キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。 つまり、(key==null ? k==null : key.equals(k))となるキーkから値vへのマッピングがこのマップに含まれる場合、このマッピングは削除されます。 マップはこのようなマッピングを1つだけ含めることができます。このマップが以前にこのキーを関連付けていた値を返します。キーに対するマッピングがマップになかった場合は
nullを返します。 戻り値のnullは、マップがキーのマッピングを保持していなかったことを示すとはかぎりません。つまり、マップが明示的にキーをnullにマップしていた可能性もあります。呼出しが戻ると、マップは指定されたキーのマッピングを含まなくなります。
-
clear
public void clear()すべてのマッピングをマップから削除します。 この呼出しが戻ると、マップは空になります。 -
containsValue
public boolean containsValue(Object value)このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。- 定義:
- インタフェース
Map<K,V>内のcontainsValue - オーバーライド:
- クラス
AbstractMap<K,V>のcontainsValue - パラメータ:
value- このマップにあるかどうかが判定される値- 戻り値:
- このマップが1つまたは複数のキーを指定された値にマッピングしている場合は
true
-
keySet
このマップに含まれるキーのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。 セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAll操作はサポートされていません。 -
values
public Collection<V> values()このマップに含まれる値のCollectionビューを返します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove、Collection.remove、removeAll、retainAll、およびclearオペレーションを通して行います。addまたはaddAll操作はサポートされていません。 -
entrySet
このマップに含まれるマッピングのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションを通して行います。addまたはaddAll操作はサポートされていません。
-