public class IdentityHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Serializable, Cloneable
このクラスは、汎用の Map 実装ではありません。このクラスが Map インタフェースを実装していると、オブジェクトの比較時に equals メソッドの使用を要求する Map の一般的な規約に意図的に違反をします。このクラスは、参照の同一性のセマンティクスが要求された場合にのみ使用されるように設計されています。
このクラスの通常の使用では、直列化またはディープコピーなど、トポロジを保持するオブジェクトグラフ変換を行います。このような変換を実行するために、プログラムは、すでに処理されたすべてのオブジェクト参照を追跡する「ノードテーブル」を保持する必要があります。別個のオブジェクトが等しい場合でも、ノードテーブルはそのオブジェクトを同等視してはいけません。このクラスのもうひとつの使用法は、プロキシオブジェクトを維持することです。たとえば、デバッグ機能は、デバッグされたプログラムで各オブジェクトのプロキシオブジェクトを維持できます。
このクラスは、マップに関連するオプションのオペレーションをすべてサポートし、null 値および null キーを使用できます。このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。
このクラスは、システムアイデンティティーハッシュ関数 (System.identityHashCode(Object)) が複数のバケットに要素を適切に分散させると仮定して、基本オペレーション (get および put) に一定時間のパフォーマンスを提供します。
このクラスにはチューニングパラメータがひとつあります。チューニングパラメータはセマンティクスではなく、パフォーマンスに影響を与えます。すなわち、予想最大サイズです。このパラメータは、マップが保持されると予想されるキー値マッピングの最大数です。このパラメータを使用して、ハッシュテーブルを初期構成するバケットの数を算出します。予想された最大サイズとバケット数との正確な関係は指定されていません。
マップのサイズ (キーと値のマッピングの数) が、予想最大サイズを大幅に超えた場合、バケット数が増加されます。バケット数 (ハッシュのやり直し) を増加させるとかなりコストがかかるため、十分に大きい予想最大サイズのアイデンティティーハッシュマップを作成したほうが適切です。一方、コレクションビューの繰り返しは、ハッシュテーブルのバケット数に比例した時間を要求します。そのため繰り返しのパフォーマンスまたはメモリー使用に特に懸念がある場合は、予想最大サイズをあまり大きくしないようにします。
この実装は同期化されません。複数のスレッドが並行してアイデンティティーハッシュマップにアクセスし、それらのスレッドの少なくとも 1 つが構造的にマップを変更する場合には、外部で同期をとる必要があります。構造的な変更とは、1 つ以上のマッピングを追加または削除するオペレーションのことです。すでにインスタンスに格納されているキーに関連付けられた値を変更することは構造的な変更ではありません。これは通常、マップを自然にカプセル化する一部のオブジェクトで synchronized することによって達成されます。
そのようなオブジェクトが存在しない場合は、Collections.synchronizedMap メソッドを使用してマップを「ラップ」することをお勧めします。マップが誤って synchronized なしでアクセスされるのを防ぐために、作成時に行うことをお勧めします。
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
このクラスのすべての「コレクションビューメソッド」によって返されるコレクションの iterator メソッドによって返されるイテレータは、フェイルファストです。つまり、イテレータの作成後に、そのイテレータ自身の remove メソッド以外の方法でマップが構造的に変更されると、そのイテレータは ConcurrentModificationException をスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。フェイルファストイテレータは最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「フェイルファストのイテレータはバグを検出するためにのみ使用すべきです。」
実装にあたっての注意:Sedgewick と Knuth のテキストの例で説明したように、フェイルファストイテレータは、単純な線形プローブのハッシュテーブルです。その配列は、キーと値の保持を交互に行います。個別の配列を使って行うよりも、大きなテーブルについてより適切な局所性があります。多くの JRE 実装とオペレーションミックスでは、このクラスは、(線形プローブではなくチェーンに使用する) HashMap よりも高性能のパフォーマンスをもたらします。
このクラスは、Java Collections Framework のメンバーです。
System.identityHashCode(Object), Object.hashCode(), Collection, Map, HashMap, TreeMap, 直列化された形式AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<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)
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合は
null を返します。 |
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 ビューを返します。 |
toStringpublic IdentityHashMap()
public IdentityHashMap(int expectedMaxSize)
expectedMaxSize - マップの予想最大サイズIllegalArgumentException - expectedMaxSize が負である場合public IdentityHashMap(Map<? extends K,? extends V> m)
m - マッピングがこのマップに配置されるマップNullPointerException - 指定されたマップが null の場合public int size()
public boolean isEmpty()
public V get(Object key)
null を返します。
つまり、このメソッドは、(key == k) となるキー k から値 v へのマッピングがこのマップに含まれている場合は v を返し、それ以外の場合は null を返します。 (このようなマッピングは 1 つのみ存在できます。)
戻り値 null は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーを null にマップすることもあります。containsKey オペレーションを使うと、これらの 2 つの場合を区別できます。
get、インタフェース: Map<K,V>get、クラス: AbstractMap<K,V>key - 関連付けられた値が返されるキーnullput(Object, Object)public boolean containsKey(Object key)
containsKey、インタフェース: Map<K,V>containsKey、クラス: AbstractMap<K,V>key - 使用可能なキーtruecontainsValue(Object)public boolean containsValue(Object value)
containsValue、インタフェース: Map<K,V>containsValue、クラス: AbstractMap<K,V>value - このマップにあるかどうかが判定される値containsKey(Object)public V put(K key, V value)
put、インタフェース: Map<K,V>put、クラス: AbstractMap<K,V>key - 指定された値が関連付けられるキーvalue - 指定されたキーに関連付けられる値Object.equals(Object), get(Object), containsKey(Object)public void putAll(Map<? extends K,? extends V> m)
putAll、インタフェース: Map<K,V>putAll、クラス: AbstractMap<K,V>m - このマップに格納されるマッピングNullPointerException - 指定されたマップが null の場合public void clear()
public boolean equals(Object o)
このマップが通常のマップと比較される場合、このマップの参照同一性ベースのセマンティクスによって、Object.equals 規約のシンメトリと移行の要件に違反することができます。ただし、Object.equals 規約は、複数の IdentityHashMap インスタンス間に保持することが保証されています。
equals、インタフェース: Map<K,V>equals、クラス: AbstractMap<K,V>o - このマップと等しいかどうかが比較されるオブジェクトObject.equals(Object)public int hashCode()
Object.hashCode() の一般規約によって要求されるように、任意の 2 つの IdentityHashMap インスタンス m1 と m2 で m1.equals(m2) であれば、m1.hashCode()==m2.hashCode() となることが保証されます。
比較されている 2 つのオブジェクトがそれぞれ IdentityHashMap インスタンスと通常のマップである場合は、このマップの entrySet メソッドによって返されたセット内にある Map.Entry インスタンスの参照同一性ベースのセマンティクスによって、前の段落で説明されていた Object.hashCode の規約上の要件に違反することができます。
hashCode、インタフェース: Map<K,V>hashCode、クラス: AbstractMap<K,V>Object.equals(Object), equals(Object)public Object clone()
clone、クラス: AbstractMap<K,V>Cloneablepublic Set<K> keySet()
このメソッドが返したオブジェクトが、Set インタフェースを実装している間、オブジェクトは、Set の一般規約には従いません。オブジェクトの元になるマップのように、このメソッドが返したセットは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの contains、remove、containsAll、equals、および hashCode メソッドの動作に影響を与えます。
指定されたオブジェクトが、返されたセットとまったく同じオブジェクト参照を含むセットである場合にかぎり、返されたセットの equals メソッドは true を返します。このメソッドによって返されたセットが通常のセットと比較される場合、Object.equals 規約のシンメトリと移行の要件に違反する場合があります。ただし、Object.equals 規約は、このメソッドによって返されたセット間に保持することが保証されています。
返されたセットの hashCode メソッドは、要素のハッシュコードの合計ではなく、セット内の要素のアイデンティティーハッシュコードの合計を返します。これは、このメソッドが返した複数のセットに、Object.hashCode メソッドの一般規約を適用するために、equals メソッドのセマンティクスの変更によって要求されます。
keySet、インタフェース: Map<K,V>keySet、クラス: AbstractMap<K,V>Object.equals(Object), System.identityHashCode(Object)public Collection<V> values()
Collection ビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションの反復処理中にマップが変更された場合は、反復処理の結果は定義されません。コレクションは要素の削除をサポートします。Iterator.remove、Collection.remove、removeAll、retainAll、clear の各メソッドを使って対応するマッピングをマップから削除します。add または addAll メソッドはサポートしていません。
このメソッドが返したオブジェクトが、Collection インタフェースを実装している間、オブジェクトは、Collection の一般規約には従いません。オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの contains、remove、および containsAll メソッドの動作に影響を与えます。
public Set<Map.Entry<K,V>> entrySet()
Set ビューを返します。返されるセット内の各要素は参照同一性ベースの Map.Entry です。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合は、反復処理の結果は定義されません。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、clear の各メソッドを使って対応するマッピングをマップから削除します。add または addAll メソッドはサポートしていません。
元となるマップのように、このメソッドによって返されたセット内の Map.Entry オブジェクトは、オブジェクトの同一性でなく、参照の同一性として、キーと値の同一性を定義します。これは、Map.Entry オブジェクトの equals および hashCode メソッドの動作に影響を与えます。参照同一性ベースの Map.Entry e は、o が Map.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 規約は、複数のアイデンティティーベースのマップエントリ、およびこのようなエントリの複数のセット間に保持することが保証されています。
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.