モジュール 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クラスと同じようなパフォーマンス特性を持ち、初期容量負荷係数の同じ効率パラメータを持ちます。

ほとんどのコレクション・クラスと同じように、このクラスは同期化されていません。 同期化されているWeakHashMapCollections.synchronizedMapメソッドを使って作成できます。

このクラスは、equalsメソッドが==演算子を使ってオブジェクト識別情報を判定するキー・オブジェクトと一緒に使うことを主な目的としています。 このようなキーが破棄されると二度と作り直されることはないので、後にWeakHashMap内のそのキーの検索を行って、そのエントリが削除されていたことに驚くような事態は起こり得ません。 このクラスは、Stringインスタンスなどのオブジェクト識別情報に基づかないequalsメソッドを持つキー・オブジェクトも適切に処理します。 ただし、そのような作り直し可能なキー・オブジェクトでは、すでにキーが破棄されたWeakHashMapエントリの自動的な削除によって、混乱が生じる場合があります。

WeakHashMapクラスの動作の一部はガベージ・コレクタのアクションに依存するので、よく知られていても必要ではない、いくつかのMapインバリアントはこのクラスに適しません。 ガベージ・コレクタはキーをいつでも破棄できるので、WeakHashMapは未知のスレッドが通知なしでエントリを削除中であるかのように動作します。 特に、WeakHashMapインスタンス上で同期をとり、その変更用メソッドのどれも呼び出さない場合でも、sizeメソッドはより小さな値を時間の経過とともに返すことがあります。isEmptyメソッドはfalseを返してからtrueを返すことがあります。containsKeyメソッドは、指定されたキーに対してtrueを返したあとでfalseを返すことがあります。getメソッドは、指定されたキーの値を返したあとでnullを返すことがあります。putメソッドとremoveメソッドは、以前マップにあるように見えたキーに対してそれぞれnullfalseを返すことがあります。キー・セット、値コレクション、エントリ・セットを連続して検査すると、出力される要素の数が少なくなっていくことがあります。

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

実装にあたってのノート: WeakHashMap内の値オブジェクトは、通常の強参照によって保持されます。 このため、値のオブジェクトが直接的にも間接的にも強くそれ自体のキーを参照しないようにしてください。そうすれば、キーが破棄されないようになります。 値オブジェクトはWeakHashMap自体を介してそのキーを間接的に参照できることに注意してください。つまり、値オブジェクトがほかのキー・オブジェクトを強く参照し、それに関連付けられている値オブジェクトが今度は最初の値オブジェクトのキーを強く参照することがあります。 マップ内の値が、それらへの強参照を保持するマップに依存していない場合、これに対処する方法の1つは、m.put(key, new WeakReference(value))のように、値自体をWeakReferences内にラップした後で挿入することです。そして、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ビューを返します。
    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を作成します。
      パラメータ:
      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()
      このマップ内のキー値マッピングの数を返します。 この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。
      定義:
      インタフェース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)
      キーのマッピングがある場合に、そのマッピングをこの弱ハッシュ・マップから削除します。 つまり、(key==null ? k==null : key.equals(k))となるキーkから値vへのマッピングがこのマップに含まれる場合、このマッピングは削除されます。 マップはこのようなマッピングを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
      戻り値:
      マップ内に保持されているマッピングのセット・ビュー