K
- このマップで保持されるキーの型V
- マップされる値の型public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
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
をスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
イテレータのフェイルファスト動作は実際には保証できません。一般的に、synchronized なしの並行変更がある場合、確実に保証することは不可能です。フェイルファストイテレータは、ベストエフォートベースで ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファスト動作はバグを検出するためにのみ使用すべきです。
このクラスは、Java Collections Framework のメンバーです。
HashMap
, WeakReference
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 ビューを返します。 |
clone, equals, hashCode, toString
public WeakHashMap(int initialCapacity, float loadFactor)
initialCapacity
- WeakHashMap の初期容量loadFactor
- WeakHashMap の負荷係数IllegalArgumentException
-初期容量が負の場合、または負荷係数が正でない場合。public WeakHashMap(int initialCapacity)
initialCapacity
- WeakHashMap の初期容量IllegalArgumentException
- 初期容量が負の場合public WeakHashMap()
public WeakHashMap(Map<? extends K,? extends V> m)
m
- マッピングがこのマップに配置されるマップNullPointerException
- 指定されたマップが null の場合public int size()
public boolean isEmpty()
public V get(Object key)
null
を返します。
つまり、このメソッドは、(key==null ? k==null : key.equals(k))
となるキー k
から値 v
へのマッピングがこのマップに含まれている場合は v
を返し、それ以外の場合は null
を返します。このようなマッピングが 1 つだけあります。
戻り値 null
は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーを null
にマップすることもあります。containsKey
オペレーションを使うと、これらの 2 つの場合を区別できます。
get
、インタフェース: Map<K,V>
get
、クラス: AbstractMap<K,V>
key
- 関連付けられた値が返されるキーnull
put(Object, Object)
public boolean containsKey(Object key)
containsKey
、インタフェース: Map<K,V>
containsKey
、クラス: AbstractMap<K,V>
key
- このマップ内にあるかどうかが判定されるキーpublic V put(K key, V value)
public void putAll(Map<? extends K,? extends V> m)
putAll
、インタフェース: Map<K,V>
putAll
、クラス: AbstractMap<K,V>
m
- このマップに格納されるマッピング。NullPointerException
- 指定されたマップが null の場合。public V remove(Object key)
(key==null ? k==null : key.equals(k))
となるキー k から値 v へのマッピングがこのマップに含まれる場合、このマッピングは削除されます。マップはこのようなマッピングを 1 つだけ含めることができます。
このマップが以前にこのキーを関連付けていた値を返します。キーに対するマッピングがマップになかった場合は null を返します。戻り値の null は、マップがキーのマッピングを保持していなかったことを示すとはかぎりません。つまり、マップが明示的にキーを null にマップしていた可能性もあります。
呼び出しが戻ると、マップは指定されたキーのマッピングを含まなくなります。
public void clear()
public boolean containsValue(Object value)
containsValue
、インタフェース: Map<K,V>
containsValue
、クラス: AbstractMap<K,V>
value
- このマップにあるかどうかが判定される値public Set<K> keySet()
Set
ビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません (イテレータ自身の remove オペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、および clear オペレーションで対応するマッピングをマップから削除します。add または addAll オペレーションはサポートしていません。public Collection<V> values()
Collection
ビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されていません (イテレータ自身の remove オペレーションを除く)。コレクションは要素の削除をサポートします。Iterator.remove、Collection.remove、removeAll、retainAll、および clear オペレーションで対応するマッピングをマップから削除します。add または addAll オペレーションはサポートしていません。public Set<Map.Entry<K,V>> entrySet()
Set
ビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません (イテレータ自身の remove オペレーション、またはイテレータにより返されるマップエントリに対する setValue オペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、および clear オペレーションで対応するマッピングをマップから削除します。add または addAll オペレーションはサポートしていません。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.