CDC 1.1.2

java.util
クラス IdentityHashMap

java.lang.Object
  上位を拡張 java.util.AbstractMap
      上位を拡張 java.util.IdentityHashMap
すべての実装されたインタフェース:
Serializable, Cloneable, Map

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

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

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

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

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

このクラスは、Java Collections Framework のメンバーです。

導入されたバージョン:
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)
          このアイデンティティーハッシュマップの指定されたキーに対応する値か、このマップにこのキーに対応するマッピングが存在しない場合は null を返します。
 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 - 指定されたキーに関連付けられる値
戻り値:
key に関連付けられた以前の値、 または、キーのマッピングがない場合は 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 ビューにある各エントリのハッシュコードの合計です。これにより、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
戻り値:
このマップのシャローコピー
関連項目:
Cloneable

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 の一般規約には決して従いません。オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの 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
戻り値:
このマップ内に含まれているアイデンティティーマッピングのセットビュー

CDC 1.1.2

Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. Use of this specification is subject to license terms.