|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.util.AbstractMap | +--java.util.IdentityHashMap
このクラスは、キーと値を比較する時にオブジェクトの同一性の代わりにリファレンスの同一性を使用して、ハッシュテーブルを持つ 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
よりも高性能のパフォーマンスをもたらします。
System.identityHashCode(Object)
,
Object.hashCode()
,
Collection
,
Map
,
HashMap
,
TreeMap
,
直列化された形式入れ子クラスの概要 |
クラス java.util.Map から継承した入れ子クラス |
Map.Entry |
コンストラクタの概要 | |
IdentityHashMap()
デフォルトの予想最大サイズ (21) で、新しい空のアイデンティティハッシュマップを構築します。 |
|
IdentityHashMap(int expectedMaxSize)
指定した予想最大サイズで、新しい空のマップを構築します。 |
|
IdentityHashMap(Map m)
指定されたマップのキーと値のマッピングを含む新しいアイデンティティハッシュマップを構築します。 |
メソッドの概要 | |
void |
clear()
すべてのマッピングをマップから削除します。 |
Object |
clone()
アイデンティティハッシュマップのシャローコピーを返します。 |
boolean |
containsKey(Object key)
指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。 |
boolean |
containsValue(Object value)
指定されたオブジェクト参照が、このアイデンティティハッシュマップのキーかどうかを判定します。 |
Set |
entrySet()
マップに含まれているマッピングのセットビューを返します。 |
boolean |
equals(Object o)
指定されたオブジェクトとマップが等しいかどうかを比較します。 |
Object |
get(Object key)
この識別情報ハッシュマップで指定されたキーにマップされている値を返します。 |
int |
hashCode()
マップのハッシュコード値を返します。 |
boolean |
isEmpty()
アイデンティティハッシュマップにキーと値のマッピングが含まれない場合に true を返します。 |
Set |
keySet()
マップに格納されているキーのアイデンティティベースのセットビューを返します。 |
Object |
put(Object key,
Object value)
指定の値と指定されたキーをこのアイデンティティハッシュマップに関連付けます。 |
void |
putAll(Map t)
指定のマップからすべてのマッピングをマップにコピーします。 |
Object |
remove(Object key)
キーに対するマッピングがあれば、そのキーをマップから削除します。 |
int |
size()
このアイデンティティハッシュマップ内のキーと値のマッピングの数を返します。 |
Collection |
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 m)
m
- マッピングがこのマップに配置されるマップ
NullPointerException
- 指定されたマップが null の場合メソッドの詳細 |
public int size()
Map
内の size
AbstractMap
内の size
public boolean isEmpty()
Map
内の isEmpty
AbstractMap
内の isEmpty
public Object get(Object key)
Map
内の get
AbstractMap
内の get
key
- 関連付けられた値が返されるキー
put(Object, Object)
public boolean containsKey(Object key)
Map
内の containsKey
AbstractMap
内の containsKey
key
- 可能なキー
true
containsValue(Object)
public boolean containsValue(Object value)
Map
内の containsValue
AbstractMap
内の containsValue
value
- マップにあるかどうかを判定される値
containsKey(Object)
public Object put(Object key, Object value)
Map
内の put
AbstractMap
内の put
key
- 指定される値が関連付けられるキーvalue
- 指定されるキーに関連付けられる値
Object.equals(Object)
,
get(Object)
,
containsKey(Object)
public void putAll(Map t)
Map
内の putAll
AbstractMap
内の putAll
t
- マップに格納されるマッピング
NullPointerException
- 指定されたマップが null の場合public Object remove(Object key)
Map
内の remove
AbstractMap
内の remove
key
- マッピングがマップから削除されるキー
public void clear()
Map
内の clear
AbstractMap
内の clear
public boolean equals(Object o)
このマップが通常のマップと比較される場合、このマップの参照同一性ベースのセマンティクスによって、Object.equals 規約のシンメトリと移行の要件に違反することができます。ただし、Object.equals 規約は、複数の IdentityHashMap インスタンス間に保持することが保証されています。
Map
内の equals
AbstractMap
内の 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
内の hashCode
AbstractMap
内の hashCode
Object.hashCode()
,
Object.equals(Object)
,
equals(Object)
public Object clone()
AbstractMap
内の clone
public Set keySet()
このメソッドが返したオブジェクトが、Set インタフェースを実装している間、オブジェクトは、Set の一般規約には従いません。オブジェクトの元になるマップのように、このメソッドが返したセットは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの contains、remove、containsAll、equals、および hashCode メソッドの動作に影響を与えます。
指定されたオブジェクトが、返されたセットと全く同じオブジェクト参照を含むセットである場合にかぎり、返されたセットの equals メソッドは true を返します。このメソッドによって返されたセットが通常のセットと比較される場合、Object.equals 規約のシンメトリと移行の要件を違反する場合があります。ただし、Object.equals 規約は、このメソッドによって返されたセット間に保持することが保証されています。
返されたセットの hashCode メソッドは、要素のハッシュコードの合計ではなく、セット内の要素の「アイデンティティハッシュコード」の合計を返します。これは、このメソッドが返した複数のセットに、Object.hashCode メソッドの一般規約を適用するために、equals メソッドのセマンティクスの変更によって要求されます。
Map
内の keySet
AbstractMap
内の keySet
Object.equals(Object)
,
System.identityHashCode(Object)
public Collection values()
このマップに格納されている値のコレクションビューを返します。コレクションはマップを基にしているのでマップへの変更、およびコレクションへの変更は反映されます。コレクションでの繰り返し処理の進行中にマップが変更された場合、反復の結果は定義されていません。コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除することができます。削除は、Iterator.remove、Collection.remove、removeAll、retainAll、および clear の各メソッドを通して行います。add メソッド、または addAll メソッドはサポートされません。
このメソッドが返したオブジェクトが、Collection インタフェースを実装している間、オブジェクトは、Collection's の一般規約には決して従いません。オブジェクトの元になるマップのように、このメソッドが返すコレクションは、オブジェクトの同一性でなく、参照の同一性として、要素の同一性を定義します。このことは、オブジェクトの contains、remove および containsAll メソッドの動作に影響を与えます。
Map
内の values
AbstractMap
内の values
public Set 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
内の entrySet
AbstractMap
内の entrySet
|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.