|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
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 HashMap(...));
このクラスのすべての「コレクションビューメソッド」によって返される反復子は、「フェイルファスト」です。反復子の作成後に、反復子自体の remove メソッドまたは add メソッド以外の方法でマップを構造的に変更すると、反復子は ConcurrentModificationException をスローします。したがって、同時変更が行われると、反復子は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の同時変更がある場合、確かな保証を行うことは不可能なので、反復子のフェイルファストの動作を保証することはできません。フェイルファスト反復子は最善努力原則に基づき、ConcurrentModificationException をスローします。従って、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「フェイルファストの反復子はバグを検出するためにのみ使用すべきです」
実装上の注意: Sedgewick と Knuth のテキストの例で説明したように、フェイルファスト反復子は、単純な「線形プローブ」のハッシュテーブルです。その配列は、キーと値の保持を交互に行います。個別の配列を使って行うよりも、大きなテーブルについてより適切な局所性があります。多くの JRE 実装とオペレーションミックスでは、このクラスは、(線形プローブではなくチェーンに使用する) HashMap
よりも高性能のパフォーマンスをもたらします。
このクラスは、Java Collections Framework のメンバです。
System.identityHashCode(Object)
,
Object.hashCode()
,
Collection
,
Map
,
HashMap
,
TreeMap
,
直列化された形式入れ子のクラスの概要 |
---|
インタフェース 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()
マップに含まれているマッピングのセットビューを返します。 |
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> t)
指定されたマップからすべてのマッピングをマップにコピーします。 |
V |
remove(Object key)
キーに対するマッピングがあれば、そのキーをマップから削除します。 |
int |
size()
このアイデンティティハッシュマップ内のキーと値のマッピングの数を返します。 |
Collection<V> |
values()
このマップに格納されている値のコレクションビューを返します。 |
クラス 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)
Map<K,V>
内の get
AbstractMap<K,V>
内の get
key
- 関連付けられた値が返されるキー
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> t)
Map<K,V>
内の putAll
AbstractMap<K,V>
内の putAll
t
- マップに格納されるマッピング
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 インスタンス t1 と t2 について t1.equals(t2) であれば、t1.hashCode()==t2.hashCode() となることが保証されます。
比較されている 2 つのオブジェクトがそれぞれ IdentityHashMap インスタンスと通常のマップである場合は、このマップの entrySet メソッドによって返されたセット内にある Map.Entry インスタンスの参照同一性ベースのセマンティクスによって、前の段落で説明されていた Object.hashCode の規約上の要件に違反することができます。
Map<K,V>
内の hashCode
AbstractMap<K,V>
内の hashCode
Object.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()
このマップに格納されている値のコレクションビューを返します。コレクションはマップを基にしているのでマップへの変更、およびコレクションへの変更は反映されます。コレクションでの繰り返し処理の進行中にマップが変更された場合、反復の結果は定義されていません。コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、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()
元となるマップのように、このメソッドによって返されたセット内の 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 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。