JavaTM Platform
Standard Ed. 6

java.util
クラス IdentityHashMap<K,V>

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

public class IdentityHashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, 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 IdentityHashMap(...));
 

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

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

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

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

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

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

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

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

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

containsValue

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

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

put

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

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

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)
キーに対するマッピングがあれば、そのキーをマップから削除します。

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

clear

public void clear()
すべてのマッピングをマップから削除します。この呼び出しが戻ると、マップは空になります。

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

equals

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

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

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

hashCode

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

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

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

clone

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

オーバーライド:
クラス AbstractMap<K,V> 内の clone
戻り値:
このマップのシャローコピー
関連項目:
Cloneable

keySet

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

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

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

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

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

values

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

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

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

entrySet

public Set<Map.Entry<K,V>> entrySet()
このマップに含まれるマップの Set ビューを返します。返されるセット内の各要素は参照同一性ベースの 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<K,V> 内の entrySet
定義:
クラス AbstractMap<K,V> 内の entrySet
戻り値:
このマップ内に含まれているアイデンティティーマッピングのセットビュー

JavaTM Platform
Standard Ed. 6

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

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