|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.util.AbstractMap<K,V> java.util.IdentityHashMap<K,V>
public class IdentityHashMap<K,V>
このクラスは、キーと値を比較する時にオブジェクトの同一性の代わりにリファレンスの同一性を使用して、ハッシュテーブルを持つ 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) に一定時間のパフォーマンスを提供します。
このクラスにはチューニングパラメータがひとつあります。チューニングパラメータはセマンティクスではなく、パフォーマンスに影響を与えます。すなわち、「予想最大サイズ」です。このパラメータは、マップが保持されると予想されるキー値マッピングの最大数です。このパラメータを使用して、ハッシュテーブルを初期構成するバケットの数を算出します。予想された最大サイズとバケット数との正確な関係は指定されていません。
マップのサイズ (キーと値のマッピングの数) が、予想最大サイズを大幅に超えた場合、バケット数が増加されます。 バケット数 (ハッシュのやり直し) を増加させるとかなりコストがかかるため、十分に大きい予想最大サイズのアイデンティティーハッシュマップを作成したほうが適切です。一方、コレクションビューの繰り返しは、ハッシュテーブルのバケット数に比例した時間を要求します。 そのため繰り返しのパフォーマンスまたはメモリー使用に特に懸念がある場合は、予想最大サイズをあまり大きくしないようにします。
この実装は同期化されません。複数のスレッドが並行してこのアイデンティティーハッシュマップにアクセスし、それらのスレッドの少なくとも 1 つが構造的にマップを変更する場合には、外部で同期をとる必要があります。構造的な変更とは、1 つ以上のマッピングを追加または削除するオペレーションのことです。すでにインスタンスに格納されているキーに関連付けられた値を変更することは構造的な変更ではありません。通常、構造的な変更は、マップを自然にカプセル化する特定のオブジェクトで同期をとることによって達成されます。
この種のオブジェクトがない場合には、Collections.synchronizedMap
メソッドを使用してマップを「ラップ」する必要があります。マップへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。
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
,
直列化された形式入れ子のクラスの概要 |
---|
クラス java.util.AbstractMap から継承された入れ子のクラス/インタフェース |
---|
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V> |
インタフェース java.util.Map から継承された入れ子のクラス/インタフェース |
---|
Map.Entry<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)
指定されたキーがマップされている値を返します。 |
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.lang.Object から継承されたメソッド |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
コンストラクタの詳細 |
---|
public IdentityHashMap()
public IdentityHashMap(int expectedMaxSize)
expectedMaxSize
- マップの予想最大サイズ
IllegalArgumentException
- expectedMaxSize が負の場合public IdentityHashMap(Map<? extends K,? extends V> m)
m
- マッピングがこのマップに配置されるマップ
NullPointerException
- 指定されたマップが null の場合メソッドの詳細 |
---|
public int size()
Map<K,V>
内の size
AbstractMap<K,V>
内の size
public boolean isEmpty()
Map<K,V>
内の isEmpty
AbstractMap<K,V>
内の isEmpty
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)
public boolean containsKey(Object key)
Map<K,V>
内の containsKey
AbstractMap<K,V>
内の containsKey
key
- 可能なキー
true
containsValue(Object)
public boolean containsValue(Object value)
Map<K,V>
内の containsValue
AbstractMap<K,V>
内の containsValue
value
- マップにあるかどうかを判定される値
containsKey(Object)
public V put(K key, V value)
Map<K,V>
内の put
AbstractMap<K,V>
内の put
key
- 指定された値が関連付けられるキーvalue
- 指定されたキーに関連付けられる値
Object.equals(Object)
,
get(Object)
,
containsKey(Object)
public void putAll(Map<? extends K,? extends V> m)
Map<K,V>
内の putAll
AbstractMap<K,V>
内の putAll
m
- マップに格納されるマッピング
NullPointerException
- 指定されたマップが null の場合public V remove(Object key)
Map<K,V>
内の remove
AbstractMap<K,V>
内の remove
key
- マッピングがマップから削除されるキー
public void clear()
Map<K,V>
内の clear
AbstractMap<K,V>
内の clear
public boolean equals(Object o)
このマップが通常のマップと比較される場合、このマップの参照同一性ベースのセマンティクスによって、Object.equals 規約のシンメトリと移行の要件に違反することができます。ただし、Object.equals 規約は、複数の IdentityHashMap インスタンス間に保持することが保証されています。
Map<K,V>
内の equals
AbstractMap<K,V>
内の equals
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 の規約上の要件に違反することができます。
Map<K,V>
内の hashCode
AbstractMap<K,V>
内の hashCode
Object.equals(Object)
,
equals(Object)
public Object clone()
AbstractMap<K,V>
内の clone
Cloneable
public Set<K> keySet()
このメソッドが返したオブジェクトが、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)
public Collection<V> values()
Collection
ビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションでの繰り返し処理の進行中にマップが変更された場合、反復処理の結果は定義されません。コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、Iterator.remove、Collection.remove、removeAll、retainAll、および clear の各メソッドを通して行います。add メソッドと addAll メソッドは、セットではサポートされていません。
このメソッドが返したオブジェクトが、Collection インタフェースを実装している間、オブジェクトは、Collection の一般規約には決して従いません。オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの contains、remove および containsAll メソッドの動作に影響を与えます。
Map<K,V>
内の values
AbstractMap<K,V>
内の values
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 規約は、複数のアイデンティティーベースのマップエントリ、およびこのようなエントリの複数のセット間に保持することが保証されています。
Map<K,V>
内の entrySet
AbstractMap<K,V>
内の entrySet
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。