JavaTM Platform
Standard Ed. 6

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)) のように、値自体を WeakReference 内にラップしたあとで挿入することです。そして、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)
          指定された Map と同じマッピングを持つ新規の 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)
          指定されたキーがマップされている値を返します。
 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.lang.Object から継承されたメソッド
finalize, getClass, notify, notifyAll, wait, wait, wait
 
インタフェース java.util.Map から継承されたメソッド
equals, hashCode
 

コンストラクタの詳細

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)
指定された Map と同じマッピングを持つ新規の WeakHashMap を作成します。WeakHashMap は、指定された Map のマッピングを保持するのに十分なデフォルトの負荷係数 (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 を返します。

つまり、このメソッドは、(key==null ? k==null : key.equals(k)) となるキー 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

public V put(K key,
             V value)
指定された値と指定されたキーをこのマップに関連付けます。マップが以前にこのキーのマッピングを保持していた場合、古い値が置き換えられます。

定義:
インタフェース Map<K,V> 内の put
オーバーライド:
クラス AbstractMap<K,V> 内の put
パラメータ:
key - 指定された値が関連付けられるキー
value - 指定されたキーに関連付けられる値
戻り値:
key に関連付けられた以前の値、 または、キーのマッピングがない場合は null。(null の戻り値は、keynull を以前関連付けていたマップを示す場合もある)

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==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 の各オペレーションを通して行います。Set は、add オペレーションや addAll オペレーションはサポートしていません。

定義:
インタフェース Map<K,V> 内の keySet
オーバーライド:
クラス AbstractMap<K,V> 内の keySet
戻り値:
マップに含まれているキーのセットビュー

values

public Collection<V> values()
このマップに含まれる値の Collection ビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません (反復子自身の remove オペレーションを除く)。コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。 削除は、Iterator.removeCollection.removeremoveAllretainAll、および clear オペレーションを通して行います。Set は、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 の各オペレーションを通して行います。Set は、add オペレーションや addAll オペレーションはサポートしていません。

定義:
インタフェース Map<K,V> 内の entrySet
定義:
クラス AbstractMap<K,V> 内の entrySet
戻り値:
マップ内に保持されているマッピングのセットビュー

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。