の アイデンティティハッシュマップ 実装する 地図 使用するインターフェース ハッシュテーブル キー (および値) を比較するときに、オブジェクトの等価性の代わりに参照の等価性を使用します。このクラスは汎用の Map 実装ではありません。このクラスは Map インターフェイスを実装していますが、オブジェクトを比較するときに equals() メソッドの使用を義務付ける Map の一般規約に意図的に違反しています。 このクラスは、ユーザーが参照を介してオブジェクトを比較する必要がある場合に使用されます。に属します java.util パッケージ。
IdentityHashMapの特徴
- これは、equals() メソッドを使用する代わりに == 演算子を使用する参照等価に従います。
- 同期されていないため、外部で同期する必要があります。
- イテレータはフェイルファストスローです ConcurrentModificationException 反復中に変更を試みます。
- このクラスは、システム ID ハッシュ関数 (System.identityHashCode(Object)) がバケット間で要素を適切に分散していることを前提として、基本操作 (get および put) に対して一定時間のパフォーマンスを提供します。 IdentityHashMap は hashCode() メソッドを使用せず、代わりに System.identityHashCode() メソッドを使用します。これは、マッピングが IdentityHashMap 内に格納されるときにハッシュ コードが変更される可能性がある Map のキーとして可変オブジェクトを使用できるため、大きな違いです。
宣言:
パブリック クラス IdentityHashMap
AbstractMapを拡張します マップを実装します シリアライズ可能 クローン可能
ここ K はキーのオブジェクト タイプであり、 V 値はオブジェクトタイプです。
Java では、IdentityHashMap は Map インターフェイスを実装するクラスです。これは HashMap クラスに似ていますが、主な違いは、IdentityHashMap がキーを比較するときにオブジェクトの等価性ではなく参照の等価性を使用することです。
HashMap は、equals() メソッドを使用してキーを比較しますが、IdentityHashMap は、== 演算子を使用してキーを比較します。これは、IdentityHashMap では、2 つのキーが内容に関して等しいのではなく、同じオブジェクトである場合にのみ等しいとみなされることを意味します。
jsではnullではありません
Java で IdentityHashMap を使用する方法の例を次に示します。
Javaimport java.util.IdentityHashMap; public class Example { public static void main(String[] args) { IdentityHashMap<String Integer> identityHashMap = new IdentityHashMap<>(); identityHashMap.put('A' 1); identityHashMap.put(new String('A') 2); System.out.println(identityHashMap.size()); // 2 System.out.println(identityHashMap.get('A')); // 1 } }
出力;
2
1
Java の IdentityHashMap クラスは、キー (および値) を比較するときにオブジェクトの等価性の代わりに参照の等価性を使用する Map インターフェイスのハッシュ テーブル ベースの実装です。
HashMap よりも IdentityHashMap を使用する利点:
- 検索の高速化: IdentityHashMap は比較に参照の等価性を使用するため、オブジェクトの等価性を使用する HashMap と比較して検索が高速になります。
- オブジェクト インスタンスの比較に便利: IdentityHashMap は、オブジェクトの値ではなくオブジェクト インスタンスを比較する場合に役立ちます。
IdentityHashMap を使用するデメリット:
- より多くのメモリを使用します: IdentityHashMap は、オブジェクトへの参照を保存する必要があるため、HashMap と比較してより多くのメモリを使用します。
- すべてのユースケースに適しているわけではない: IdentityHashMap はすべてのユースケースに適しているわけではなく、特定の状況では予期しない動作を引き起こす可能性があるため、注意して使用する必要があります。
IdentityHashMap の階層
それは実装します シリアル化可能 クローン可能 地図
例:
Java// Java code to demonstrate IdentityHashMap import java.util.Map; import java.util.HashMap; import java.util.IdentityHashMap; public class IdentityHashMapExample { public static void main(String[] args) { // creating an instance of IdentityHashMap Map<String String> ihm = new IdentityHashMap<>(); // Putting key and value pair // in a IdentityHashMap Object ihm.put('ihmkey''ihmvalue'); ihm.put(new String('ihmkey')'ihmvalue1'); // ihm.size() will print 2 since it // compares the objects by reference System.out.println('Size of IdentityHashMap--'+ihm.size()); } }
出力
Size of IdentityHashMap--2
IdentityHashMap のコンストラクター
のインスタンスを作成できます アイデンティティハッシュマップ 2 つの方法:
gimpで選択を解除するにはどうすればよいですか
IdentityHashMapihm = new IdentityHashMap (); (or) Map hm = new IdentityHashMap ();
1.IdentityHashMap(): デフォルトの予想最大サイズを使用して、新しい空の ID ハッシュ マップを構築します。
アイデンティティハッシュマップ
彼 = 新しい IdentityHashMap ();
2.IdentityHashMap(int ExpectedMaxSize): 指定された予想最大サイズで新しい空のマップを構築します。
アイデンティティハッシュマップ
ihm = 新しい IdentityHashMap(int ExpectedMaxSize);
3.IdentityHashMap(マップm): 指定されたマップ内のキーと値のマッピングを含む新しい ID ハッシュ マップを構築します。
アイデンティティハッシュマップ
ihm = 新しい IdentityHashMap(Map m);
IdentityHashMap の基本操作
1. 要素の追加
IdentityHashMap にマッピングを挿入または追加するには、 置く() そして putAll() 方法。 put() は、特定のキーと、それが特定のマップにマッピングしている値を挿入できます。既存のキーが渡された場合、以前の値は新しい値に置き換えられます。 putAll() はすべての要素、つまりあるマップから別のマップへのマッピングをコピーします。
Java// Java code to illustrate // adding elements to IdentityHashMap import java.util.*; public class AddingElementsToIdentityHashMap { public static void main(String[] args) { // Creating an empty IdentityHashMap Map<Integer String> identity_hash = new IdentityHashMap<Integer String>(); // Mapping string values to int keys // using put() method identity_hash.put(10 'Geeks'); identity_hash.put(15 '4'); identity_hash.put(20 'Geeks'); identity_hash.put(25 'Welcomes'); identity_hash.put(30 'You'); // Displaying the IdentityHashMap System.out.println('Initial Mappings are: ' + identity_hash); // Inserting existing key along with new value // previous value gets returned and stored in // returned_value String returned_value = (String)identity_hash.put(20 'All'); // Verifying the returned value System.out.println('Returned value is: ' + returned_value); // Displaying the new map System.out.println('New map is: ' + identity_hash); // Creating a new Identityhash map and copying Map<Integer String> new_Identityhash_map = new IdentityHashMap<Integer String>(); new_Identityhash_map.putAll(identity_hash); // Displaying the final IdentityHashMap System.out.println('The new map: ' + new_Identityhash_map); } }
出力
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Returned value is: Geeks New map is: {30=You 10=Geeks 15=4 25=Welcomes 20=All} The new map: {30=You 10=Geeks 15=4 25=Welcomes 20=All} 2. 要素の削除
使用するマッピングを削除するには 取り除く() IdentityHashMap クラスの組み込みメソッドであり、マップから特定のキーのマッピングを削除するために使用されます。
// Java code to illustrate removing // elements from IdentityHashMap import java.util.*; public class RemovingMappingsFromIdentityHashMap { public static void main(String[] args) { // Creating an empty IdentityHashMap Map<Integer String> Identity_hash = new IdentityHashMap<Integer String>(); // Mapping string values to int keys Identity_hash.put(10 'Geeks'); Identity_hash.put(15 '4'); Identity_hash.put(20 'Geeks'); Identity_hash.put(25 'Welcomes'); Identity_hash.put(30 'You'); // Displaying the IdentityHashMap System.out.println('Initial Mappings are: ' + Identity_hash); // Removing the existing key mapping String returned_value = (String)Identity_hash.remove(20); // Verifying the returned value System.out.println('Returned value is: ' + returned_value); // Displaying the new map System.out.println('New map is: ' + Identity_hash); } }
出力
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Returned value is: Geeks New map is: {30=You 10=Geeks 15=4 25=Welcomes} 3. 要素へのアクセス
IdentityHashMap の要素には、 得る() この例を以下に示します。
Java// Java code to illustrate the accessing // elements from IdentityHashMap import java.util.*; public class AccessingElementsFromIdentityHashMap { public static void main(String[] args) { // Creating an empty IdentityHashMap Map<Integer String> identity_hash = new IdentityHashMap<Integer String>(); // Mapping string values to int keys identity_hash.put(10 'Geeks'); identity_hash.put(15 '4'); identity_hash.put(20 'Geeks'); identity_hash.put(25 'Welcomes'); identity_hash.put(30 'You'); // Displaying the IdentityHashMap System.out.println('Initial Mappings are: ' + identity_hash); // Getting the value of 25 System.out.println('The Value is: ' + identity_hash.get(25)); // Getting the value of 10 System.out.println('The Value is: ' + identity_hash.get(10)); // Using keySet() to get the set view of keys System.out.println('The set is: ' + identity_hash.keySet()); // Using entrySet() to get the set view System.out.println('The set is: ' + identity_hash.entrySet()); } }
出力
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} The Value is: Welcomes The Value is: Geeks The set is: [30 10 15 25 20] The set is: [30=You 10=Geeks 15=4 25=Welcomes 20=Geeks] 4. トラバース
Iterator インターフェイスを使用して、コレクション フレームワークの任意の構造を横断できます。イテレータは 1 種類のデータを扱うため、Entry を使用します。< ? ? >2 つの別々のタイプを互換性のある形式に解決します。次に、 next() メソッドを使用して、IdentityHashMap の要素を出力します。
// Java code to illustrate the // iterating over IdentityHashmap import java.util.*; public class IteratingIdentityHashMap { public static void main(String[] args) { // Creating an empty IdentityHashMap IdentityHashMap<Integer String> identity_hash = new IdentityHashMap<Integer String>(); // Mapping string values to int keys identity_hash.put(10 'Geeks'); identity_hash.put(15 '4'); identity_hash.put(20 'Geeks'); identity_hash.put(25 'Welcomes'); identity_hash.put(30 'You'); // Displaying the IdentityHashMap System.out.println('Initial Mappings are: ' + identity_hash); // Create an Iterator over the // IdentityHashMap Iterator<IdentityHashMap.Entry<Integer String> > itr = identity_hash.entrySet().iterator(); // The hasNext() method is used to check if there is // a next element The next() method is used to // retrieve the next element while (itr.hasNext()) { IdentityHashMap.Entry<Integer String> entry = itr.next(); System.out.println('Key = ' + entry.getKey() + ' Value = ' + entry.getValue()); } } }
出力
Initial Mappings are: {30=You 10=Geeks 15=4 25=Welcomes 20=Geeks} Key = 30 Value = You Key = 10 Value = Geeks Key = 15 Value = 4 Key = 25 Value = Welcomes Key = 20 Value = Geeks 同期された IdentityHashMap
複数のスレッドがアイデンティティ ハッシュ マップに同時にアクセスし、少なくとも 1 つのスレッドがマップを構造的に変更する場合は、外部で同期する必要があります。 (構造変更とは、1 つ以上のマッピングを追加または削除する操作です。インスタンスに既に含まれているキーに関連付けられた値を変更するだけでは、構造変更ではありません。) これは通常、マップを自然にカプセル化するオブジェクトを同期することによって実現されます。そのようなオブジェクトが存在しない場合は、マップを使用して「ラップ」する必要があります。 Collections.synchronizedMap 方法。これは、マップへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
IdentityHashMap のメソッド
- IdentityHashMap はキーと値の比較に等価演算子「==」を使用しますが、HashMap は Map 内のキーと値の比較に equals メソッドを使用します。
- IdentityHashMapはequals()を使用しないため、高価なequals()を使用するオブジェクトのHashMapよりも比較的高速です。
- IdentityHashMap は、equals() に依存しないため、キーが不変である必要はありません。
方法 | 説明 Java 置換オール |
|---|---|
| クリア() | このマップからすべてのマッピングを削除します。 |
| クローン() | このアイデンティティ ハッシュ マップの浅いコピーを返します。キーと値自体は複製されません。 |
| containsKey?(オブジェクトキー) | 指定されたオブジェクト参照がこのアイデンティティ ハッシュ マップのキーであるかどうかをテストします。 |
| containsValue?(オブジェクト値) | 指定されたオブジェクト参照がこのアイデンティティ ハッシュ マップ内の値であるかどうかをテストします。 |
| エントリーセット() | を返します セット このマップに含まれるマッピングのビュー。 |
| 等しい?(オブジェクト o) | 指定されたオブジェクトとこのマップが等しいかどうかを比較します。 |
| get?(オブジェクトキー) | 指定されたキーがマップされている値を返します。このマップにキーのマッピングが含まれていない場合は null を返します。 |
| ハッシュコード() | このマップのハッシュ コード値を返します。 |
| isEmpty() | この ID ハッシュ マップにキーと値のマッピングが含まれていない場合は true を返します。 |
| キーセット() | このマップに含まれるキーの ID ベースのセット ビューを返します。 |
| put?(KキーV値) | 指定された値をこのアイデンティティ ハッシュ マップ内の指定されたキーに関連付けます。 |
| putAll?(地図 extends K?? extends V>m) | 指定されたマップからこのマップにすべてのマッピングをコピーします。 |
| 削除?(オブジェクトキー) | このキーのマッピングが存在する場合は、このマップからこのキーのマッピングを削除します。 |
| サイズ() | このアイデンティティ ハッシュ マップ内のキーと値のマッピングの数を返します。 |
| 値() | このマップに含まれる値のコレクション ビューを返します。 |
クラス java.util.AbstractMap で宣言されたメソッド
方法 | 説明 |
|---|---|
| toString() | このマップの文字列表現を返します。 |
インタフェース java.util.Map で宣言されたメソッド
方法 | 説明 |
|---|---|
| compute?(K キー BiFunction super K?? super V?? extends V>リマッピング機能) | 指定されたキーとその現在のマップ値 (または、現在のマッピングがない場合は null) のマッピングの計算を試みます。 |
| computeIfAbsent?(K キー 機能 super K?? extends V>マッピング機能) | 指定されたキーがまだ値に関連付けられていない (または null にマップされている) 場合、指定されたマッピング関数を使用してその値を計算し、null でない限りその値をこのマップに入力します。 |
| computeIfPresent?(K キー BiFunction super K?? super V?? extends V>リマッピング機能) | 指定されたキーの値が存在し、null 以外の場合は、キーとその現在のマップ値を指定して新しいマッピングを計算しようとします。 |
| forEach?(バイコンシューマー super K?? super V>アクション) | すべてのエントリが処理されるか、アクションが例外をスローするまで、このマップ内の各エントリに対して指定されたアクションを実行します。 |
| getOrDefault?(オブジェクトキーVdefaultValue) | 指定されたキーがマップされている値を返します。このマップにキーのマッピングが含まれていない場合は、defaultValue を返します。 |
| merge?(K キー V 値 BiFunction super V?? super V?? extends V>リマッピング機能) | 指定されたキーがまだ値に関連付けられていない場合、または null に関連付けられている場合は、そのキーを指定された非 null 値に関連付けます。 |
| putIfAbsent?(KキーV値) | 指定されたキーがまだ値に関連付けられていない (または null にマップされている) 場合は、そのキーを指定された値に関連付けて null を返し、それ以外の場合は現在の値を返します。 |
| 削除?(オブジェクトキー オブジェクト値) | 指定されたキーが現在指定された値にマップされている場合にのみ、指定されたキーのエントリを削除します。 |
| replace?(KキーV値) | 指定されたキーが現在何らかの値にマップされている場合にのみ、そのキーのエントリを置き換えます。 |
| replace?(K キー V oldValue V newValue) | 現在指定された値にマップされている場合にのみ、指定されたキーのエントリを置き換えます。 |
| replaceAll?(BiFunction super K?? super V?? extends V>関数) | すべてのエントリが処理されるか関数が例外をスローするまで、各エントリの値をそのエントリに対して指定された関数を呼び出した結果に置き換えます。 |
IdentityHashMap との比較 ハッシュマップ
以下のプログラムは、IdentityHashMap と HashMap 実装の違いを示しています。
Java// Java code to demonstrate IdentityHashMap and // illustration of how it is different from HashMap import java.util.Map; import java.util.HashMap; import java.util.IdentityHashMap; public class IdentityHashMapExample { public static void main(String[] args) { // Creating HashMap and IdentityHashMap objects Map<String String> hm = new HashMap<>(); Map<String String> ihm = new IdentityHashMap<>(); // Putting key and value in HashMap and IdentityHashMap Object hm.put('hmkey''hmvalue'); hm.put(new String('hmkey')'hmvalue1'); ihm.put('ihmkey''ihmvalue'); ihm.put(new String('ihmkey')'ihmvalue1'); // Print Size of HashMap and WeakHashMap Object // hm.size() will print 1 since it compares the objects logically // and both the keys are same System.out.println('Size of HashMap is : '+hm.size()); // ihm.size() will print 2 since it compares the objects by reference System.out.println('Size of IdentityHashMap is : '+ihm.size()); } }
出力
Size of HashMap is : 1 Size of IdentityHashMap is : 2
IdentityHashMap は、Map インターフェイスを実装し、参照の等価性を使用してキーを比較する Java のクラスです。これは通常の HashMap に似ていますが、equals() メソッドの代わりに == 演算子を使用してキーを比較します。これは、内容は同じだがオブジェクト参照が異なる 2 つのキーが、IdentityHashMap 内で別個のキーとして扱われることを意味します。
Java で IdentityHashMap を使用する方法の例を次に示します。
Java
import java.util.IdentityHashMap; public class IdentityHashMapExample { public static void main(String[] args) { IdentityHashMap<String Integer> map = new IdentityHashMap<>(); // Add key-value pairs to the map String key1 = new String('key'); String key2 = new String('key'); map.put(key1 1); map.put(key2 2); // Get values from the map using the same and different keys System.out.println(map.get(key1)); // Output: 1 System.out.println(map.get(key2)); // Output: 2 System.out.println(map.get(new String('key'))); // Output: null } }
出力
1 2 null
この例では、文字列キーを整数値にマップする IdentityHashMap を作成します。同じ内容を持つ 2 つの異なる String オブジェクトを使用して、2 つのキーと値のペアをマップに追加します。次に、同じまたは異なる String オブジェクトを使用してマップから値を取得します。同じ内容を持つ 2 つの異なるキーを使用してマップから値を取得できるが、同じ内容を持つが異なるオブジェクト参照である String オブジェクトを使用して値を取得できないことがわかります。
IdentityHashMap の動作は通常の HashMap とはわずかに異なり、一般に参照の同等性が重要な特定の状況でのみ役立つことに注意してください。ほとんどの場合、通常の HashMap で十分であり、より適切です。
データベースの正規化
クイズの作成