モジュール 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
関連項目:
  • ネストされたクラスのサマリー

    クラス java.util.AbstractMapで宣言されたネストされたクラス/インタフェース

    AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    デフォルトの初期容量(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
    すべてのマッピングをマップから削除します。
    boolean
    指定されたキーのマッピングがこのマップに含まれている場合にtrueを返します。
    boolean
    このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。
    このマップに含まれるマッピングのSetビューを返します。
    get(Object key)
    指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。
    boolean
    このマップがキーと値のマッピングを保持しない場合にtrueを返します。
    このマップに含まれるキーのSetビューを返します。
    static <K, V> WeakHashMap<K,V>
    newWeakHashMap(int numMappings)
    予想されるマッピング数に適した新しい空のWeakHashMapを作成します。
    put(K key, V value)
    指定された値と指定されたキーをこのマップに関連付けます。
    void
    putAll(Map<? extends K,? extends V> m)
    指定されたマップからすべてのマッピングをマップにコピーします。
    キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。
    int
    このマップ内のキー値マッピングの数を返します。
    このマップに含まれる値のCollectionビューを返します。

    クラス java.util.AbstractMapで宣言されたメソッド

    clone, equals, hashCode, toString

    クラス java.lang.Objectで宣言されたメソッド

    finalize, getClass, notify, notifyAll, wait, wait, wait

    インタフェース java.util.Mapで宣言されたメソッド

    compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
  • コンストラクタの詳細

    • WeakHashMap

      public WeakHashMap(int initialCapacity, float loadFactor)
      指定された初期容量と指定された負荷係数を持つ、空の新しいWeakHashMapを構築します。
      APIのノート:
      予想される数のマッピングに対応する初期容量を持つWeakHashMapを作成するには、newWeakHashMapを使用します。
      パラメータ:
      initialCapacity - WeakHashMapの初期容量
      loadFactor - WeakHashMapの負荷係数
      例外:
      IllegalArgumentException -初期容量が負の場合、または負荷係数が正でない場合。
    • WeakHashMap

      public WeakHashMap(int initialCapacity)
      指定された初期容量およびデフォルトのロード・ファクタ(0.75)を使用して、新しい空のWeakHashMapを作成します。
      APIのノート:
      予想される数のマッピングに対応する初期容量を持つWeakHashMapを作成するには、newWeakHashMapを使用します。
      パラメータ:
      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()
      このマップ内のキー値マッピングの数を返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。
      定義:
      インタフェースMap<K,V>内のsize
      オーバーライド:
      クラスAbstractMap<K,V>size
      戻り値:
      このマップ内のキーと値のマッピングの数
    • isEmpty

      public boolean isEmpty()
      このマップがキーと値のマッピングを保持しない場合にtrueを返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。
      定義:
      インタフェースMap<K,V>内のisEmpty
      オーバーライド:
      クラスAbstractMap<K,V>isEmpty
      戻り値:
      このマップがキーと値のマッピングを保持しない場合はtrue
    • get

      public V get(Object key)
      指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。

      より正式には、このマップにキーkからObjects.equals(key, k)のような値vへのマッピングが含まれている場合、このメソッドはvを返します; それ以外の場合は、nullを返します。 (このようなマッピングは1つのみ存在できます。)

      戻り値nullは、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnullにマップすることもあります。 containsKey操作を使うと、これら2つのケースを見分けることができます。

      定義:
      インタフェースMap<K,V>内のget
      オーバーライド:
      クラスAbstractMap<K,V>get
      パラメータ:
      key - 関連付けられた値が返されるキー
      戻り値:
      指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合はnull
      関連項目:
    • containsKey

      public boolean containsKey(Object key)
      指定されたキーのマッピングがこのマップに含まれている場合にtrueを返します。
      定義:
      インタフェースMap<K,V>内のcontainsKey
      オーバーライド:
      クラスAbstractMap<K,V>containsKey
      パラメータ:
      key - このマップ内にあるかどうかが判定されるキー
      戻り値:
      keyのマッピングがある場合はtrue、そうでない場合はfalse
    • put

      public V put(K key, V value)
      指定された値と指定されたキーをこのマップに関連付けます。 マップが以前にこのキーのマッピングを保持していた場合、古い値が置き換えられます。
      定義:
      インタフェースMap<K,V>内のput
      オーバーライド:
      クラスAbstractMap<K,V>put
      パラメータ:
      key - 指定の値が関連付けられるキー。
      value - 指定のキーに関連付けられる値。
      戻り値:
      keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull (戻り値nullは、マップが以前にnullkeyを関連付けていたことを示す場合もある)
    • putAll

      public void putAll(Map<? extends K,? extends V> m)
      指定されたマップからすべてのマッピングをマップにコピーします。 これにより、マップが指定されたマップ内に現在あるキーのすべてに対して持っていたマッピングが置き換えられます。
      定義:
      インタフェースMap<K,V>内のputAll
      オーバーライド:
      クラスAbstractMap<K,V>putAll
      パラメータ:
      m - このマップに格納されるマッピング。
      例外:
      NullPointerException - 指定されたマップがnullの場合。
    • remove

      public V remove(Object key)
      キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。 さらに正式には、このマップにキーkから値vへのマッピング((key==null ? k==null : key.equals(k))など)が含まれている場合、そのマッピングは削除されます。 マップはこのようなマッピングを1つだけ含めることができます。

      このマップが以前にキーを関連付けた値を返します。マップにキーのマッピングが含まれていない場合はnullを返します。 nullの戻り値は、「必ずしも」マップにキーのマッピングが含まれていないことを示しません。また、マップによってキーがnullに明示的にマップされている可能性もあります。

      呼出しが戻ると、マップは指定されたキーのマッピングを含まなくなります。

      定義:
      インタフェースMap<K,V>内のremove
      オーバーライド:
      クラスAbstractMap<K,V>remove
      パラメータ:
      key - マッピングがマップから削除されるキー
      戻り値:
      keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull
    • clear

      public void clear()
      すべてのマッピングをマップから削除します。 この呼出しが戻ると、マップは空になります。
      定義:
      インタフェースMap<K,V>内のclear
      オーバーライド:
      クラスAbstractMap<K,V>clear
    • containsValue

      public boolean containsValue(Object value)
      このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。
      定義:
      インタフェースMap<K,V>内のcontainsValue
      オーバーライド:
      クラスAbstractMap<K,V>containsValue
      パラメータ:
      value - このマップにあるかどうかが判定される値
      戻り値:
      このマップが1つまたは複数のキーを指定された値にマッピングしている場合はtrue
    • keySet

      public Set<K> keySet()
      このマップに含まれるキーのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。 セットは要素の削除をサポートします。Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションで対応するマッピングをマップから削除します。 addまたはaddAll操作はサポートされていません。
      定義:
      インタフェースMap<K,V>内のkeySet
      オーバーライド:
      クラスAbstractMap<K,V>keySet
      戻り値:
      マップに含まれているキーのセット・ビュー
    • values

      public Collection<V> values()
      このマップに含まれる値のCollectionビューを返します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeCollection.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。
      定義:
      インタフェースMap<K,V>内のvalues
      オーバーライド:
      クラスAbstractMap<K,V>values
      戻り値:
      マップ内に含まれている値のコレクション・ビュー
    • entrySet

      public Set<Map.Entry<K,V>> entrySet()
      このマップに含まれるマッピングのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。
      定義:
      インタフェースMap<K,V>内のentrySet
      戻り値:
      マップ内に保持されているマッピングのセット・ビュー
    • newWeakHashMap

      public static <K, V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
      予想されるマッピング数に適した新しい空のWeakHashMapを作成します。 返されるマップではデフォルトのロード係数0.75が使用され、初期容量は通常十分に大きいため、マップのサイズを変更せずに必要な数のマッピングを追加できます。
      型パラメータ:
      K - 新しいマップによって保持されるキーのタイプ
      V - マップされる値の型
      パラメータ:
      numMappings - マッピングの予想数
      戻り値:
      新しく作成されたマップ
      例外:
      IllegalArgumentException - numMappingsが負の場合
      導入されたバージョン:
      19