モジュール 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
関連項目:
  • ネストされたクラスのサマリー

    クラスjava.util.AbstractMapで宣言されたネストされたクラス/インタフェース

    AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>

    インタフェースjava.util.Mapで宣言されたネストされたクラス/インタフェース

    Map.Entry<K,V>
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    デフォルトの予想最大サイズ(21)で、新しい空のアイデンティティ・ハッシュ・マップを構築します。
    IdentityHashMap(int expectedMaxSize)
    指定した予想最大サイズで、新しい空のマップを構築します。
    IdentityHashMap(Map<? extends K,? extends V> m)
    指定されたマップのキーと値のマッピングを含む新しいアイデンティティ・ハッシュ・マップを構築します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    void
    すべてのマッピングをマップから削除します。
    アイデンティティ・ハッシュ・マップのシャロー・コピーを返します。キーと値は、それ自体は複製されません。
    boolean
    指定されたオブジェクト参照が、このアイデンティティ・ハッシュ・マップのキーかどうかを判定します。
    boolean
    指定されたオブジェクト参照が、このアイデンティティ・ハッシュ・マップの値かどうかを判定します。
    このマップに含まれるマッピングのSetビューを返します。
    boolean
    指定されたオブジェクトがこのマップと等しいかどうかを比較します。
    get(Object key)
    指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。
    int
    マップのハッシュ・コード値を返します。
    boolean
    このアイデンティティ・ハッシュ・マップにキーと値のマッピングが含まれていない場合は、trueを返します。
    マップに格納されているキーのアイデンティティ・ベースのセット・ビューを返します。
    put(K key, V value)
    指定された値と指定されたキーをこのアイデンティティ・ハッシュ・マップに関連付けます。
    void
    putAll(Map<? extends K,? extends V> m)
    指定されたマップからすべてのマッピングをマップにコピーします。
    キーに対するマッピングがあれば、そのキーをマップから削除します。
    boolean
    remove(Object key, Object value)
    指定された値に指定されたキーが現在マッピングされている場合にのみ、そのキーのエントリを削除します。
    boolean
    replace(K key, V oldValue, V newValue)
    指定されたキーが指定された値に現在マッピングされている場合にのみ、そのキーのエントリを置換します。
    int
    このアイデンティティ・ハッシュ・マップ内のキーと値のマッピングの数を返します。
    このマップに含まれる値のCollectionビューを返します。

    クラスjava.util.AbstractMapで宣言されたメソッド

    toString

    クラスjava.lang.Objectで宣言されたメソッド

    finalize, getClass, notify, notifyAll, wait, wait, wait

    インタフェースjava.util.Mapで宣言されたメソッド

    compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, replace, replaceAll
  • コンストラクタの詳細

    • 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
      関連項目:
    • containsKey

      public boolean containsKey(Object key)
      指定されたオブジェクト参照が、このアイデンティティ・ハッシュ・マップのキーかどうかを判定します。 このマップに(key == k)のようなキーkとのマッピングが含まれている場合にのみ、trueを返します。
      定義:
      インタフェースMap<K,V>内のcontainsKey
      オーバーライド:
      クラスAbstractMap<K,V>containsKey
      パラメータ:
      key - 使用可能なキー
      戻り値:
      指定されたオブジェクト参照がマップのキーである場合は、true
      関連項目:
    • containsValue

      public boolean containsValue(Object value)
      指定されたオブジェクト参照が、このアイデンティティ・ハッシュ・マップの値かどうかを判定します。 このマップに(value == v)のような値vのマッピングが含まれている場合にのみ、trueを返します。
      定義:
      インタフェースMap<K,V>内のcontainsValue
      オーバーライド:
      クラスAbstractMap<K,V>containsValue
      パラメータ:
      value - このマップにあるかどうかが判定される値
      戻り値:
      このマップが1つ以上のキーを指定されたオブジェクト参照にマップする場合、true
      関連項目:
    • put

      public V put(K key, V value)
      指定された値と指定されたキーをこのアイデンティティ・ハッシュ・マップに関連付けます。 このマップがキーのマッピングをすでにcontainsしている場合は、古い値が置き換えられます。そうでない場合は、新しいマッピングがこのマップに挿入されます。
      定義:
      インタフェースMap<K,V>内のput
      オーバーライド:
      クラスAbstractMap<K,V>put
      パラメータ:
      key - 指定された値が関連付けられるキー
      value - 指定されたキーに関連付けられる値
      戻り値:
      keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull (戻り値nullは、マップが以前にnullkeyを関連付けていたことを示す場合もある)
      関連項目:
    • putAll

      public void putAll(Map<? extends K,? extends V> m)
      指定されたマップからすべてのマッピングをマップにコピーします。 指定したマップの各マッピングについて、このマップがキーのマッピングをすでにcontainsしている場合、その値は指定されたマップの値に置き換えられます。それ以外の場合は、新しいマッピングがこのマップに挿入されます。
      定義:
      インタフェースMap<K,V>内のputAll
      オーバーライド:
      クラスAbstractMap<K,V>putAll
      パラメータ:
      m - このマップに格納されるマッピング
      例外:
      NullPointerException - 指定されたマップがnullの場合
    • remove

      public V remove(Object key)
      キーに対するマッピングがあれば、そのキーをマップから削除します。 マッピングに(キー== k)などのキーkがある場合のみ、マッピングが削除されます。
      定義:
      インタフェースMap<K,V>内のremove
      オーバーライド:
      クラスAbstractMap<K,V>remove
      パラメータ:
      key - マッピングがマップから削除されるキー
      戻り値:
      keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull (戻り値nullは、マップが以前にnullkeyを関連付けていたことを示す場合もある)
    • 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と等しくなります。 このマップのエントリの等価性については、entrySetメソッドを参照してください。

      このマップの参照等価性ベースのセマンティクスにOwingを指定すると、このマップを通常のマップと比較すると、Object.equals契約の対称性および推移性の要件に違反する可能性があります。 ただし、Object.equals契約は、IdentityHashMap instances.間で保持されることが保証されています

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

      public int hashCode()
      マップのハッシュ・コード値を返します。 マップのハッシュ・コードは、このマップの各エントリのハッシュ・コードの合計として定義されます。 このマップのエントリのハッシュ・コードの指定については、entrySetメソッドを参照してください。

      この指定により、Object.hashCode()の一般的な契約で必要となる2つのIdentityHashMapインスタンスm1およびm2に対するm1.equals(m2)が暗黙的に指定されます。

      このマップのentrySetメソッドによって返されるセット内のMap.Entryインスタンスの参照等価性ベースのセマンティクスにより、比較される2つのオブジェクトのいずれかがIdentityHashMapインスタンスで、もう一方が通常のマップの場合、前の段落で説明したObject.hashCodeの契約上の要件に違反する可能性があります。

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

      public Object clone()
      アイデンティティ・ハッシュ・マップのシャロー・コピーを返します。キーと値は、それ自体は複製されません。
      オーバーライド:
      クラスAbstractMap<K,V>clone
      戻り値:
      このマップのシャロー・コピー
      関連項目:
    • keySet

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

      このメソッドによって返されるWhileは、Setインタフェースを実装し、Set's一般契約に従いません。 オブジェクトの元になるマップのように、このメソッドが返したセットは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。 これは、そのcontains, remove, containsAll, equalsおよびhashCode methods.の動作に影響

      返されたセットのThe equalsメソッドは、指定されたオブジェクトが、返されたセットとまったく同じオブジェクト参照を含むセットである場合にのみ、trueを返します。 このメソッドから返されるセットを通常のセットと比較すると、Object.equals契約の対称および過渡性要件に違反する可能性があります。 ただし、Object.equals契約は、このmethod.によって返されるセット間で保持されることが保証されています

      返されたセットのhashCodeメソッドは、ハッシュ・コードの合計ではなく、セット内の要素の「アイデンティティ・ハッシュ・コード」の合計を返します。 これは、このメソッドによって返されるセット間でObject.hashCodeメソッドの一般的な契約を強制するために、equalsメソッドのセマンティクスの変更によって義務付けられます。

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

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

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

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

      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は、oMap.Entryおよびe.getKey()==o.getKey() && e.getValue()==o.getValue()の場合にのみ、オブジェクトoと等しくなります。 これらの等価セマンティクスに対応するために、hashCodeメソッドはSystem.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue())を返します。 (キーと値は参照等価を使用して比較されますが、Map.Entryオブジェクト自体は比較されません。)

      このメソッドによって返されるセット内のMap.Entryインスタンスの参照等価性ベースのセマンティクスにOwingを指定すると、Object.equals(Object)契約の対称性および推移性要件が考えられますセット内のいずれかのエントリを通常のマップ・エントリと比較した場合、またはこのメソッドから返されるセットが通常のマップ・エントリのセット(通常のマップでこのメソッドへのコールによって返されるなど)と比較した場合、違反します。 ただし、Object.equals契約は、アイデンティティ・ベースのマップ・エントリ間およびこのようなエントリのセット間で保持されることが保証されています。

      定義:
      インタフェースMap<K,V>内のentrySet
      戻り値:
      このマップ内に含まれているアイデンティティ・マッピングのセット・ビュー
    • remove

      public boolean remove(Object key, Object value)
      指定された値に指定されたキーが現在マッピングされている場合にのみ、そのキーのエントリを削除します。

      より正式には、このマップにキーkから値vへのマッピング((key == k)および(value == v)など)が含まれている場合、このメソッドはこのキーのマッピングを削除し、trueを返します。それ以外の場合は、falseを返します。

      定義:
      インタフェースMap<K,V>内のremove
      パラメータ:
      key - 指定された値が関連付けられるキー
      value - 指定されたキーに関連付けられていると予想される値
      戻り値:
      値が削除された場合はtrue
    • replace

      public boolean replace(K key, V oldValue, V newValue)
      指定されたキーが指定された値に現在マッピングされている場合にのみ、そのキーのエントリを置換します。

      より正式には、このマップにキーkから値vへのマッピング((key == k)および(oldValue == v)など)が含まれている場合、このメソッドはknewValueに関連付け、trueを返します。それ以外の場合は、falseを返します。

      定義:
      インタフェースMap<K,V>内のreplace
      パラメータ:
      key - 指定された値が関連付けられるキー
      oldValue - 指定されたキーに関連付けられていると予想される値
      newValue - 指定されたキーに関連付けられる値
      戻り値:
      値が置換された場合はtrue