- 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つのキーk1
とk2
が同等であるとみなされます。 通常は、HashMap
のようなMap
実装では、(k1==null ? k2==null : k1.equals(k2))
の場合にかぎり2つのキーk1
とk2
が同等であるとみなされます。このクラスは、汎用の
Map
実装ではありません。 このクラスがMap
インタフェースを実装していると、オブジェクトの比較時にequals
メソッドの使用を要求するMap
の一般的な規約に意図的に違反をします。 このクラスは、参照の同一性のセマンティックスが要求された場合にのみ使用されるように設計されています。このクラスの通常の使用では、直列化またはディープ・コピーなど、トポロジを保持するオブジェクト・グラフ変換を行います。 このような変換を実行するために、プログラムは、すでに処理されたすべてのオブジェクト参照を追跡する「ノード表」を保持する必要があります。 別個のオブジェクトが等しい場合でも、ノード表はそのオブジェクトを同等視してはいけません。 このクラスのもうひとつの使用法は、プロキシ・オブジェクトを維持することです。 たとえば、デバッグ機能は、デバッグされたプログラムで各オブジェクトのプロキシ・オブジェクトを維持できます。
このクラスは、マップに関連するオプションのオペレーションをすべてサポートし、
null
値およびnull
キーを使用できます。 このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。このクラスは、システム・アイデンティティ・ハッシュ関数(
System.identityHashCode(Object)
)が複数のバケットに要素を適切に分散させると仮定して、基本オペレーション(get
およびput
)に一定時間のパフォーマンスを提供します。このクラスにはチューニング・パラメータがひとつあります。チューニング・パラメータはセマンティックスではなく、パフォーマンスに影響を与えます。すなわち、予想最大サイズです。 このパラメータは、マップが保持されると予想されるキー値マッピングの最大数です。 このパラメータを使用して、ハッシュ表を初期構成するバケットの数を算出します。 予想された最大サイズとバケット数との正確な関係は指定されていません。
マップのサイズ(キーと値のマッピング数)が期待される最大サイズをかなりの大きさで超過する場合、バケットの数は増加します。 バケットの数の増加(ハッシュのやり直し)は非常に費用がかかるため、大きさが十分な期待される最大サイズでアイデンティティ・ハッシュを作成すると費用を抑えられます。 一方、コレクション・ビューの繰返しは、ハッシュ表のバケット数に比例した時間を要求します。そのため繰返しのパフォーマンスまたはメモリー使用に特に懸念がある場合は、予想最大サイズをあまり大きくしないようにします。
この実装はsynchronizedされません。 複数のスレッドが並行してアイデンティティ・ハッシュ・マップにアクセスし、それらのスレッドの少なくとも1つが構造的にマップを変更する場合は、外部でその同期をとる必要があります。 構造的な変更とは、1つ以上のマッピングを追加または削除するオペレーションのことです。すでにインスタンスに格納されているキーに関連付けられた値を変更することは構造的な変更ではありません。 これは通常、マップを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。 そのようなオブジェクトが存在しない場合は、
Collections.synchronizedMap
メソッドを使用してマップを「ラップ」することをお薦めします。 マップが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。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>
-
-
コンストラクタのサマリー
コンストラクタ コンストラクタ 説明 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
ビューを返します。-
クラス java.util.AbstractMapで宣言されたメソッド
toString
-
インタフェース java.util.Mapで宣言されたメソッド
compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, 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()
このアイデンティティ・ハッシュ・マップ内のキーと値のマッピングの数を返します。
-
isEmpty
public boolean 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
は、マップが以前にnull
とkey
を関連付けていたことを示す場合もある)- 関連項目:
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の場合
-
clear
public void 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
インスタンスm1
とm2
で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.remove
、Set.remove
、removeAll
、retainAll
、clear
の各メソッドを使って対応するマッピングをマップから削除します。add
またはaddAll
メソッドはサポートしていません。このメソッドが返したオブジェクトが、
Set
インタフェースを実装している間、オブジェクトは、Set
の一般規約には従いません。 オブジェクトの元になるマップのように、このメソッドが返したセットは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。 このことは、オブジェクトのcontains
、remove
、containsAll
、equals
、および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.remove
、Collection.remove
、removeAll
、retainAll
、clear
の各メソッドを使って対応するマッピングをマップから削除します。add
またはaddAll
メソッドはサポートしていません。このメソッドが返したオブジェクトが、
Collection
インタフェースを実装している間、オブジェクトは、Collection
の一般規約には従いません。 オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。 このことは、オブジェクトのcontains
、remove
、およびcontainsAll
メソッドの動作に影響を与えます。
-
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
は、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
規約は、複数のアイデンティティ・ベースのマップ・エントリ、およびこのようなエントリの複数のセット間に保持することが保証されています。
-
-