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)に一定時間のパフォーマンスを提供します。
このクラスにはチューニング・パラメータがひとつあります。チューニング・パラメータはセマンティックスではなく、パフォーマンスに影響を与えます。すなわち、予想最大サイズです。このパラメータは、マップが保持されると予想されるキー値マッピングの最大数です。このパラメータを使用して、ハッシュ表を初期構成するバケットの数を算出します。予想された最大サイズとバケット数との正確な関係は指定されていません。
マップのサイズ(キーと値のマッピングの数)が、予想最大サイズを大幅に超えた場合、バケット数が増加されます。バケット数(ハッシュのやり直し)を増加させるとかなりコストがかかるため、十分に大きい予想最大サイズのアイデンティティ・ハッシュ・マップを作成したほうが適切です。一方、コレクション・ビューの繰返しは、ハッシュ表のバケット数に比例した時間を要求します。そのため繰返しのパフォーマンスまたはメモリー使用に特に懸念がある場合は、予想最大サイズをあまり大きくしないようにします。
この実装はsynchronizedされません。複数のスレッドが並行してアイデンティティ・ハッシュ・マップにアクセスし、それらのスレッドの少なくとも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)
指定されたオブジェクトがこのマップと等しいかどうかを比較します。
|
void |
forEach(BiConsumer<? super K,? super V> action)
このマップのすべてのエントリの処理が完了するかアクションから例外がスローされるまで、各エントリに対して指定されたアクションを実行します。
|
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)
キーに対するマッピングがあれば、そのキーをマップから削除します。
|
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
すべてのエントリが処理されるか、または関数が例外をスローするまで、各エントリの値を、そのエントリで指定された関数を呼び出した結果で置換します。
|
int |
size()
このアイデンティティ・ハッシュ・マップ内のキーと値のマッピングの数を返します。
|
Collection<V> |
values()
このマップに含まれる値の
Collection ビューを返します。 |
toString
compute, computeIfAbsent, computeIfPresent, getOrDefault, merge, putIfAbsent, remove, replace, replace
public 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
- 関連付けられた値が返されるキーnull
put(Object, Object)
public boolean containsKey(Object key)
containsKey
、インタフェース: Map<K,V>
containsKey
、クラス: AbstractMap<K,V>
key
- 使用可能なキーtrue
containsValue(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>
Cloneable
public 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規約は、複数のアイデンティティ・ベースのマップ・エントリ、およびこのようなエントリの複数のセット間に保持することが保証されています。
public void forEach(BiConsumer<? super K,? super V> action)
Map
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
replaceAll
、インタフェース: Map<K,V>
function
- 各エントリに適用する関数 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.