- 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
内のそのキーの検索を行って、そのエントリが削除されていたことに驚くような事態は起こり得ません。 このクラスは、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
を構築します。
-
メソッドのサマリー
すべてのメソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 void
clear()
すべてのマッピングをマップから削除します。boolean
containsKey(Object key)
指定されたキーのマッピングがこのマップに含まれている場合にtrue
を返します。boolean
containsValue(Object value)
このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrue
を返します。Set<Map.Entry<K,V>>
entrySet()
このマップに含まれるマッピングのSet
ビューを返します。V
get(Object key)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合はnull
を返します。boolean
isEmpty()
このマップがキーと値のマッピングを保持しない場合にtrue
を返します。Set<K>
keySet()
このマップに含まれるキーのSet
ビューを返します。V
put(K key, V value)
指定された値と指定されたキーをこのマップに関連付けます。void
putAll(Map<? extends K,? extends V> m)
指定されたマップからすべてのマッピングをマップにコピーします。V
remove(Object key)
キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。int
size()
このマップ内のキー値マッピングの数を返します。Collection<V>
values()
このマップに含まれる値のCollection
ビューを返します。-
クラス java.util.AbstractMapで宣言されたメソッド
clone, equals, hashCode, toString
-
インタフェース 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
public WeakHashMap(Map<? extends K,? extends V> m)
指定されたマップと同じマッピングを持つ、新しいWeakHashMap
を構築します。WeakHashMap
は、デフォルトの負荷係数(0.75)、および指定されたマップのマッピングを保持するのに十分な初期容量で作成されます。- パラメータ:
m
- マッピングがこのマップに配置されるマップ- 例外:
NullPointerException
- 指定されたマップがnullの場合- 導入されたバージョン:
- 1.3
-
-
メソッドの詳細
-
size
public int size()
このマップ内のキー値マッピングの数を返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。
-
isEmpty
public boolean isEmpty()
このマップがキーと値のマッピングを保持しない場合にtrue
を返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。
-
get
public V get(Object key)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合はnull
を返します。より正式には、このマップにキー
k
からObjects.equals(key, k)
のような値v
へのマッピングが含まれている場合、このメソッドはv
を返します; それ以外の場合は、null
を返します。 このようなマッピングは1つのみ存在できます。戻り値
null
は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnull
にマップすることもあります。containsKey
操作を使うと、これら2つのケースを見分けることができます。- 定義:
get
、インタフェース:Map<K,V>
- オーバーライド:
get
、クラス:AbstractMap<K,V>
- パラメータ:
key
- 関連付けられた値が返されるキー- 戻り値:
- 指定されたキーがマップされている値。このマップにそのキーのマッピングが含まれていない場合は
null
- 関連項目:
put(Object, Object)
-
containsKey
public boolean containsKey(Object key)
指定されたキーのマッピングがこのマップに含まれている場合にtrue
を返します。- 定義:
containsKey
、インタフェース:Map<K,V>
- オーバーライド:
containsKey
、クラス:AbstractMap<K,V>
- パラメータ:
key
- このマップ内にあるかどうかが判定されるキー- 戻り値:
key
に対するマッピングがある場合はtrue
、そうでない場合はfalse
-
put
public V put(K key, V value)
指定された値と指定されたキーをこのマップに関連付けます。 マップが以前にこのキーのマッピングを保持していた場合、古い値が置き換えられます。
-
putAll
public void putAll(Map<? extends K,? extends V> m)
指定されたマップからすべてのマッピングをマップにコピーします。 これにより、マップが指定されたマップ内に現在あるキーのすべてに対して持っていたマッピングが置き換えられます。- 定義:
putAll
、インタフェース:Map<K,V>
- オーバーライド:
putAll
、クラス:AbstractMap<K,V>
- パラメータ:
m
- このマップに格納されるマッピング。- 例外:
NullPointerException
- 指定されたマップがnullの場合。
-
remove
public V remove(Object key)
キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。 つまり、(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
を返します。- 定義:
containsValue
、インタフェース:Map<K,V>
- オーバーライド:
containsValue
、クラス:AbstractMap<K,V>
- パラメータ:
value
- このマップにあるかどうかが判定される値- 戻り値:
- このマップが1つまたは複数のキーを指定された値にマッピングしている場合は
true
-
keySet
public Set<K> 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
public Set<Map.Entry<K,V>> entrySet()
このマップに含まれるマッピングのSet
ビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremove
オペレーション、またはイテレータにより返されるマップ・エントリに対するsetValue
オペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.remove
、Set.remove
、removeAll
、retainAll
、およびclear
オペレーションを通して行います。add
またはaddAll
操作はサポートされていません。
-
-