JavaTM 2
Platform
Std. Ed. v1.4.0

java.util
クラス WeakHashMap

java.lang.Object
  |
  +--java.util.AbstractMap
        |
        +--java.util.WeakHashMap
すべての実装インタフェース:
Map

public class WeakHashMap
extends AbstractMap
implements Map

ハッシュテーブルに基づいた「弱キー」による 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 でラップ解除することです。

このクラスのすべての「コレクションビューメソッド」によって返される反復子は、「フェイルファスト」です。反復子の作成後に、反復子自体の remove メソッドまたは add メソッド以外の方法でマップを構造的に変更すると、反復子は ConcurrentModificationException をスローします。したがって、同時変更が行われると、反復子は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、直ちにかつ手際よく例外をスローします。

通常、非同期の同時変更がある場合、確かな保証を行うことは不可能なので、反復子のフェイルファストの動作を保証することはできません。フェイルファスト反復子は最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「反復子のフェイルファストの動作はバグを検出するためにのみ使用すべきです」

導入されたバージョン:
1.2
関連項目:
HashMap, WeakReference

入れ子クラスの概要
 
クラス java.util.Map から継承した入れ子クラス
Map.Entry
 
コンストラクタの概要
WeakHashMap()
          デフォルトの初期容量 (16) とデフォルトの負荷係数 (0.75) を持つ、新しい空の WeakHashMap を作成します。
WeakHashMap(int initialCapacity)
          指定の初期容量とデフォルトの負荷係数 (0.75) を持つ、新しい空の WeakHashMap を作成します。
WeakHashMap(int initialCapacity, float loadFactor)
          指定の初期容量と指定の負荷係数を持つ、新しい空の WeakHashMap を作成します。
WeakHashMap(Map t)
          指定された Map と同じマッピングを持つ新規の WeakHashMap を作成します。
 
メソッドの概要
 void clear()
          すべてのマッピングをマップから削除します。
 boolean containsKey(Object key)
          マップが指定のキーのマッピングを保持する場合に true を返します。
 boolean containsValue(Object value)
          マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。
 Set entrySet()
          マップに格納されているマッピングのコレクションビューを返します。
 Object get(Object key)
          この弱ハッシュマップで指定されたキーにマップされている値を返します。
 boolean isEmpty()
          このマップがキーと値のマッピングを保持しない場合は true を返します。
 Set keySet()
          マップに格納されているキーのセットビューを返します。
 Object put(Object key, Object value)
          指定の値と指定されたキーをこのマップに関連付けます。
 void putAll(Map t)
          指定のマップからすべてのマッピングをマップにコピーします。
 Object remove(Object key)
          キーに対するマッピングがあれば、そのキーをマップから削除します。
 int size()
          このマップのキーと値のマッピングの数を返します。
 Collection values()
          マップに格納されている値のコレクションビューを返します。
 
クラス 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 t)
指定された Map と同じマッピングを持つ新規の WeakHashMap を作成します。WeakHashMap は、デフォルトの負荷係数 0.75 、および指定された Map 内でマッピングを保持するのに十分な初期容量により作成されます。

パラメータ:
t - マッピングがこのマップに配置されるマップ
例外:
NullPointerException - 指定されたマップが null である場合
導入されたバージョン:
1.3
メソッドの詳細

size

public int size()
このマップのキーと値のマッピングの数を返します。この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。

定義:
インタフェース Map 内の size
オーバーライド:
クラス AbstractMap 内の size
戻り値:
マップ内のキー値マッピングの数

isEmpty

public boolean isEmpty()
このマップがキーと値のマッピングを保持しない場合は true を返します。この結果はスナップショットとなり、参照が行われなくなるため、次のアクセスが試行される前に削除される未処理のエントリを反映しない場合があります。

定義:
インタフェース Map 内の isEmpty
オーバーライド:
クラス AbstractMap 内の isEmpty
戻り値:
マップがキーと値のマッピングを保持しない場合は true

get

public Object get(Object key)
この弱ハッシュマップで指定されたキーにマップされている値を返します。マップがこのキーのマッピングを保持していない場合は null を返します。戻り値の null は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーを null にマップすることもあります。containsKey メソッドを使うと、こうした 2 つの場合を見分けることができます。

定義:
インタフェース Map 内の get
オーバーライド:
クラス AbstractMap 内の get
パラメータ:
key - 関連付けられた値が返されるキー
戻り値:
マップが、指定されたキーにマッピングしている値。このキーに対するマッピングがマップにない場合は null
関連項目:
put(Object, Object)

containsKey

public boolean containsKey(Object key)
マップが指定のキーのマッピングを保持する場合に true を返します。

定義:
インタフェース Map 内の containsKey
オーバーライド:
クラス AbstractMap 内の containsKey
パラメータ:
key - マップにあるかどうかが判定されるキー
戻り値:
key に対するマッピングがある場合は true、そうでない場合は false

put

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

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

putAll

public void putAll(Map t)
指定のマップからすべてのマッピングをマップにコピーします。これにより、マップが指定のマップ内に現在あるキーのすべてに対して持っていたマッピングが置き換えられます。

定義:
インタフェース Map 内の putAll
オーバーライド:
クラス AbstractMap 内の putAll
パラメータ:
t - マップに格納されるマッピング
例外:
NullPointerException - 指定されたマップが null である場合

remove

public Object remove(Object key)
キーに対するマッピングがあれば、そのキーをマップから削除します。

定義:
インタフェース Map 内の remove
オーバーライド:
クラス AbstractMap 内の remove
パラメータ:
key - マッピングがマップから削除されるキー
戻り値:
指定されたキーに関連した値。または、キーのマッピングがなかった場合は null。戻り値 null は、マップが以前に null と指定されたキーを関連付けていたことを示す場合もある

clear

public void clear()
すべてのマッピングをマップから削除します。

定義:
インタフェース Map 内の clear
オーバーライド:
クラス AbstractMap 内の clear

containsValue

public boolean containsValue(Object value)
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。

定義:
インタフェース Map 内の containsValue
オーバーライド:
クラス AbstractMap 内の containsValue
パラメータ:
value - マップにあるかどうかを判定される値
戻り値:
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合は true

keySet

public Set keySet()
マップに格納されているキーのセットビューを返します。セットはマップを基にするので、マップへの変更はセットで反映され、逆にセットへの変更はマップで反映されます。セットは、Iterator.removeSet.removeremoveAllretainAll、および clear の各オペレーションより、マップから対応するマッピングを削除する要素削除処理をサポートします。add オペレーションと addAll オペレーションは、セットではサポートされません。

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

values

public Collection values()
マップに格納されている値のコレクションビューを返します。コレクションはマップを基にしているので、マップへの変更はコレクションで反映され、逆にコレクションでの変更はマップで反映されます。コレクションは、Iterator.removeCollection.removeremoveAllretainAll、および clear オペレーションにより、マップから対応するマッピングを削除する要素削除処理をサポートします。add オペレーションと addAll オペレーションは、コレクションではサポートされません。

定義:
インタフェース Map 内の values
オーバーライド:
クラス AbstractMap 内の values
戻り値:
マップ内に保持されている値のコレクションビュー

entrySet

public Set entrySet()
マップに格納されているマッピングのコレクションビューを返します。返されたコレクションの各要素は Map.Entry です。コレクションはマップを基にしているので、マップへの変更はコレクションで反映され、逆にコレクションへの変更はマップで反映されます。コレクションは、Iterator.removeCollection.removeremoveAllretainAll、および clear の各オペレーションにより、マップから対応するマッピングを削除する要素削除処理をサポートします。add オペレーションと addAll オペレーションは、コレクションではサポートされません。

定義:
インタフェース Map 内の entrySet
定義:
クラス AbstractMap 内の entrySet
戻り値:
マップ内に保持されているマッピングのコレクションビュー
関連項目:
Map.Entry

JavaTM 2
Platform
Std. Ed. v1.4.0

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

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.