モジュール java.base
パッケージ java.util

クラスIdentityHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.IdentityHashMap<K,V>
型パラメータ:
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つのキーk1およびk2は等しいとみなされます。 (通常のMap実装では、(HashMapと同様) 2つのキーk1およびk2は、(k1==null ? k2==null : k1.equals(k2))の場合にのみ等しいとみなされます。)

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

このマップのビュー・コレクションには、その要素に対する参照等価性セマンティクスもあります。 詳細は、keySetvaluesおよびentrySetメソッドを参照してください。

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

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

このクラスは、システム・アイデンティティ・ハッシュ関数(System.identityHashCode(Object))がバケット間で要素を適切に分散していることを前提として、基本操作(getおよびput)の定時パフォーマンスを提供します。

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

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

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

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

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

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

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

実装上のノート:

これは、SedgewickおよびKnuthによるテキストなどで説明されている単純なlinear-probeハッシュ表です。 配列には代替のキーと値が含まれ、偶数索引にはキー、奇数索引には値が含まれます。 (この配置は、別々の配列を使用するよりも大きな表の局所性が高くなります。) 多くのJava実装および操作が混在している場合、このクラスは、ライナー・プロファイリングではなく「連鎖」を使用するHashMapよりもパフォーマンスが向上します。

導入されたバージョン:
1.4
関連項目: