JavaTM 2
Platform
Std. Ed. v1.4.0

java.util
クラス IdentityHashMap

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

public class IdentityHashMap
extends AbstractMap
implements Map, Serializable, Cloneable

このクラスは、キーと値を比較する時にオブジェクトの同一性の代わりにリファレンスの同一性を使用して、ハッシュテーブルを持つ Map インスタンスを実装します。つまり、IdentityHashMap では、(k1==k2) の場合にかぎり 2 つのキー k1k2 が同等であると見なされます。通常は、HashMap のような Map 実装では、(k1==null ? k2==null : k1.equals(k2)) の場合にかぎり、2 つのキー k1k2 は同等であると見なされます。

このクラスは、汎用の Map 実装ではありません。このクラスが Map インタフェースを実装していると、オブジェクトの比較時に equals メソッドの使用を要求する Map の一般的な規約に意図的に違反をします。このクラスは、参照の同一性のセマンティクスが要求された場合にのみ使用されるように設計されています。

このクラスの通常の使用では、直列化またはディープコピーなど、トポロジを保持するオブジェクトグラフ変換を行います。このような変換を実行するために、プログラムは、すでに処理されたすべてのオブジェクト参照を追跡する「ノードテーブル」を保持する必要があります。別個のオブジェクトが等しい場合でも、ノードテーブルはそのオブジェクトを同等視してはいけません。このクラスのもうひとつの使用法は、「プロキシオブジェクト」を維持することです。たとえば、デバッグ機能は、デバッグされたプログラムで各オブジェクトのプロキシオブジェクトを維持できます。

このクラスは、任意のマップオペレーションをすべて提供し、null 値およびnull キーを許容します。このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。

このクラスは、システム識別ハッシュ関数 (System.identityHashCode(Object)) が複数のバケットに要素を適切に分散させると仮定して、基本オペレーション (get および put) に一定時間のパフォーマンスを提供します。

このクラスにはチューニングパラメータがひとつあります。チューニングパラメータはセマンティクスではなく、パフォーマンスに影響を与えます。すなわち、「予想最大サイズ」です。このパラメータは、マップが保持されると予想されるキー値マッピングの最大数です。このパラメータを使用して、ハッシュテーブルを初期構成するバケットの数を算出します。予想された最大サイズとバケット数との正確な関係は指定されていません。

マップのサイズ (キーと値のマッピングの数) が、予想最大サイズを大幅に超えた場合、バケット数が増加されます。バケット数 (ハッシュのやり直し) を増加させるとかなりコストがかかるため、十分に大きい予想最大サイズのアイデンティティハッシュマップを作成したほうが適切です。一方、コレクションビューの繰り返しは、ハッシュテーブルのバケット数に比例した時間を要求します。そのため繰り返しのパフォーマンスまたはメモリ使用に特に懸念がある場合は、予想最大サイズを余り大きくしないようにします。

この実装は同期化されません。複数のスレッドが同時にこのマップにアクセスし、それらのスレッドの少なくとも 1 つが構造的にマップを変更する場合には、外部で同期をとる必要があります。構造的な変更とは、1 つ以上のマッピングを追加または削除するオペレーションのことです。すでにインスタンスに格納されているキーに関連付けられた値を変更することは構造的な変更ではありません。通常、マップの同期をとるには、マップを自然にカプセル化するオブジェクトで同期をとります。そのようなオブジェクトがない場合には、Collections.synchronizedMap メソッドを使ってマップを「ラップ」します。これは、マップへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。

     Map m = Collections.synchronizedMap(new HashMap(...));
 

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

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

実装上の注意: Sedgewick と Knuth のテキストの例で説明したように、フェイルファスト反復子は、単純な「線形プローブ」のハッシュテーブルです。その配列は、キーと値の保持を交互に行います。個別の配列を使って行うよりも、大きなテーブルについてより適切な局所性があります。多くの JRE 実装とオペレーションミックスでは、このクラスは、(線形プローブではなくチェーンに使用する) HashMap よりも高性能のパフォーマンスをもたらします。

導入されたバージョン:
1.4
関連項目:
System.identityHashCode(Object), Object.hashCode(), Collection, Map, HashMap, TreeMap, 直列化された形式

入れ子クラスの概要
 
クラス java.util.Map から継承した入れ子クラス
Map.Entry
 
コンストラクタの概要
IdentityHashMap()
          デフォルトの予想最大サイズ (21) で、新しい空のアイデンティティハッシュマップを構築します。
IdentityHashMap(int expectedMaxSize)
          指定した予想最大サイズで、新しい空のマップを構築します。
IdentityHashMap(Map m)
          指定されたマップのキーと値のマッピングを含む新しいアイデンティティハッシュマップを構築します。
 
メソッドの概要
 void clear()
          すべてのマッピングをマップから削除します。
 Object clone()
          アイデンティティハッシュマップのシャローコピーを返します。
 boolean containsKey(Object key)
          指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。
 boolean containsValue(Object value)
          指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。
 Set entrySet()
          マップに含まれているマッピングのセットビューを返します。
 boolean equals(Object o)
          指定されたオブジェクトとマップが等しいかどうかを比較します。
 Object get(Object key)
          この識別情報ハッシュマップで指定されたキーにマップされている値を返します。
 int hashCode()
          マップのハッシュコード値を返します。
 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 から継承したメソッド
toString
 
クラス java.lang.Object から継承したメソッド
finalize, getClass, notify, notifyAll, wait, wait, wait
 

コンストラクタの詳細

IdentityHashMap

public IdentityHashMap()
デフォルトの予想最大サイズ (21) で、新しい空のアイデンティティハッシュマップを構築します。


IdentityHashMap

public IdentityHashMap(int expectedMaxSize)
指定した予想最大サイズで、新しい空のマップを構築します。キーと値のマッピングの予想以上の数をマップに入れると、内部データ構造が大きくなる場合があります。これには時間が多少かかる場合があります。

パラメータ:
expectedMaxSize - マップの予想最大サイズ
例外:
IllegalArgumentException - expectedMaxSize が負の場合

IdentityHashMap

public IdentityHashMap(Map m)
指定されたマップのキーと値のマッピングを含む新しいアイデンティティハッシュマップを構築します。

パラメータ:
m - マッピングがこのマップに配置されるマップ
例外:
NullPointerException - 指定されたマップが null の場合
メソッドの詳細

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)
指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。

定義:
インタフェース Map 内の containsKey
オーバーライド:
クラス AbstractMap 内の containsKey
パラメータ:
key - 可能なキー
戻り値:
指定されたオブジェクト参照がマップのキーである場合は、true
関連項目:
containsValue(Object)

containsValue

public boolean containsValue(Object value)
指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。

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

put

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

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

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

equals

public boolean equals(Object o)
指定されたオブジェクトとマップが等しいかどうかを比較します。指定されたオブジェクトがマップでもあり、2 つのマップが同じオブジェクト参照マッピングを表す場合は、true を返します。つまり、マップ this.entrySet().equals(m.entrySet()) にかぎり、このマップは別のマップ m と等しくなります。

このマップが通常のマップと比較される場合、このマップの参照同一性ベースのセマンティクスによって、Object.equals 規約のシンメトリと移行の要件に違反することができます。ただし、Object.equals 規約は、複数の IdentityHashMap インスタンス間に保持することが保証されています。

定義:
インタフェース Map 内の equals
オーバーライド:
クラス AbstractMap 内の equals
パラメータ:
o - マップと等しいかどうかを比較するオブジェクト
戻り値:
指定されたオブジェクトがマップと等しい場合は true
関連項目:
Object.equals(Object)

hashCode

public int hashCode()
マップのハッシュコード値を返します。マップのハッシュコードは、マップの entrySet ビュー内の各エントリの hashCode の合計になるように定義されます。これにより、Object.hashCode() の一般規約が要求するように、任意の 2 つの IdentityHashMap インスタンス t1t2 について t1.equals(t2) であれば、t1.hashCode()==t2.hashCode() となることが保証されます。

比較されている 2 つのオブジェクトがそれぞれ IdentityHashMap インスタンスと通常のマップである場合は、このマップの entrySet メソッドによって返されたセット内にある Map.Entry インスタンスの参照同一性ベースのセマンティクスによって、前の段落で説明されていた Object.hashCode の規約上の要件に違反することができます。

定義:
インタフェース Map 内の hashCode
オーバーライド:
クラス AbstractMap 内の hashCode
戻り値:
マップのハッシュコード値
関連項目:
Object.hashCode(), Object.equals(Object), equals(Object)

clone

public Object clone()
アイデンティティハッシュマップのシャローコピーを返します。キーと値は、それ自体は複製されません。

オーバーライド:
クラス AbstractMap 内の clone
戻り値:
このマップのシャローコピー

keySet

public Set keySet()
マップに格納されているキーのアイデンティティベースのセットビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、またセットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復の結果は保証されません。セットは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、Iterator.removeSet.removeremoveAllretainAll、および clear の各メソッドを通して行います。add メソッド、または addAll メソッドは、セットではサポートされていません。

このメソッドが返したオブジェクトが、Set インタフェースを実装している間、オブジェクトは、Set の一般規約には従いません。オブジェクトの元になるマップのように、このメソッドが返したセットは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの containsremovecontainsAllequals、および hashCode メソッドの動作に影響を与えます。

指定されたオブジェクトが、返されたセットと全く同じオブジェクト参照を含むセットである場合にかぎり、返されたセットの equals メソッドは true を返します。このメソッドによって返されたセットが通常のセットと比較される場合、Object.equals 規約のシンメトリと移行の要件を違反する場合があります。ただし、Object.equals 規約は、このメソッドによって返されたセット間に保持することが保証されています。

返されたセットの hashCode メソッドは、要素のハッシュコードの合計ではなく、セット内の要素の「アイデンティティハッシュコード」の合計を返します。これは、このメソッドが返した複数のセットに、Object.hashCode メソッドの一般規約を適用するために、equals メソッドのセマンティクスの変更によって要求されます。

定義:
インタフェース Map 内の keySet
オーバーライド:
クラス AbstractMap 内の keySet
戻り値:
マップに含まれているキーのアイデンティティベースのセットビュー
関連項目:
Object.equals(Object), System.identityHashCode(Object)

values

public Collection values()

このマップに格納されている値のコレクションビューを返します。コレクションはマップを基にしているのでマップへの変更、およびコレクションへの変更は反映されます。コレクションでの繰り返し処理の進行中にマップが変更された場合、反復の結果は定義されていません。コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、Iterator.removeCollection.removeremoveAllretainAll、および clear の各メソッドを通して行います。add メソッド、または addAll メソッドはサポートされません。

このメソッドが返したオブジェクトが、Collection インタフェースを実装している間、オブジェクトは、Collection's の一般規約には決して従いません。オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの containsremove および containsAll メソッドの動作に影響を与えます。

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

entrySet

public Set entrySet()
マップに含まれているマッピングのセットビューを返します。返されるセット内の各要素は参照同一性ベースの Map.Entry です。セットはマップと連動しているので、マップの変更はセットに反映され、セットの変更はマップに反映されます。セットの反復処理中にマップが変更された場合は、反復の結果は保証されません。セットは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、Iterator.removeSet.removeremoveAllretainAll、および clear の各メソッドを通して行います。add メソッドと addAll メソッドは、セットではサポートされていません。

元となるマップのように、このメソッドによって返されたセット内の Map.Entry オブジェクトは、オブジェクトの同一性でなく、参照の同一性として、キーと値の同一性を定義します。これは、Map.Entry オブジェクトの equals および hashCode メソッドの動作に影響を与えます。参照同一性ベースの Map.Entry e は、oMap.Entry および e.getKey()==o.getKey() && e.getValue()==o.getValue() である場合にかぎり o オブジェクトに等しくになります。こうした等しいセマンティクスに対応するために、hashCode メソッドは、System.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue()) を返します。

セットのエントリを通常のマップエントリと比較した場合、または、このメソッドが返したセットを通常のマップエントリ(通常のマップにこのメソッドを呼び出すことで返されている)のセットと比較した場合に、このメソッドによって返されたセット内の、Map.Entry インスタンスの参照同一性ベースのセマンティクスによって、Object.equals(Object) 規約のシンメトリと移行の要件に違反できます。ただし、Object.equals 規約は、複数のアイデンティティベースのマップエントリ、およびこのようなエントリの複数のセット間に保持することが保証されています。

定義:
インタフェース Map 内の entrySet
定義:
クラス AbstractMap 内の entrySet
戻り値:
このマップ内に含まれているアイデンティティマッピングのセットビュー

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.