Java - IdentityHashMapクラス

はじめに

こんにちは、未来のJava開発者たち!今日は、JavaのIdentityHashMapクラスのワクワクする世界に旅立ちましょう。さて、あなたが考えていることを我知道しています:「もう一つのマップクラス?HashMapについてはもう学んだじゃない?」そうですね、その通りですが、信じてください、IdentityHashMapは自分自身のユニークな风味を持っています。それでは、始めましょう!

Java - The IdentityHashMap Class

クラス宣言

まず最初に、IdentityHashMapをどのように宣言するかを見ていきましょう:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

このコード行は、StringキーとInteger値を格納する新しいIdentityHashMapを作成します。しかし、これが通常のHashMapと異なる点は何でしょうか?それが興味深いところです!

クラスコンストラクタ

IdentityHashMapには4つのコンストラクタがあります。それぞれを見ていきましょう:

  1. デフォルトコンストラクタ:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    これは、デフォルトのキャパシティ21で空のIdentityHashMapを作成します。

  2. 初期キャパシティを持つコンストラクタ:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    これは、指定された初期キャパシティで空のIdentityHashMapを作成します。

  3. その他のMapを持つコンストラクタ:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

    これは、指定されたMapと同じマッピングを持つIdentityHashMapを作成します。

  4. 予想最大サイズを持つコンストラクタ:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    これは、指定された予想最大サイズとロードファクターで空のIdentityHashMapを作成します。

クラスメソッド

次に、IdentityHashMapで最も一般的に使用されるメソッドのいくつかを見ていきましょう:

メソッド 説明
put(K key, V value) 指定された値を指定されたキーに関連付けます
get(Object key) 指定されたキーにマッピングされた値を返します
remove(Object key) このキーが存在する場合はそのマッピングを削除します
clear() このマップからすべてのマッピングを削除します
size() このマップ内のキーと値のマッピングの数を返します
isEmpty() このマップにキーと値のマッピングがない場合はtrueを返します
containsKey(Object key) このマップに指定されたキーのマッピングが存在する場合はtrueを返します
containsValue(Object value) このマップが指定された値に対して1つ以上のキーをマッピングしている場合はtrueを返します

これらのメソッドのいくつかを動作を見ていきましょう:

IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();

// キーと値のペアを追加
ages.put("Alice", 25);
ages.put("Bob", 30);

// 値を取得
System.out.println("Aliceの年齢: " + ages.get("Alice")); // 出力: Aliceの年齢: 25

// キーが存在するか確認
System.out.println("Charlieは存在しますか? " + ages.containsKey("Charlie")); // 出力: Charlieは存在しますか? false

// キーと値のペアを削除
ages.remove("Bob");

// サイズを確認
System.out.println("エントリの数: " + ages.size()); // 出力: エントリの数: 1

継承されたメソッド

IdentityHashMapは、スーパークラスやインターフェースからメソッドを継承しています。以下はその一部です:

継承元 メソッド
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

IdentityHashMapにキーと値のマッピングを追加する例

次に、IdentityHashMapが特別な点について深掘りましょう。HashMapとは異なり、IdentityHashMapはequals()メソッドを使用してキーを比較するのではなく、リファレンス等価性(==)を使用します。これは、2つのキーがメモリ内の正確に同じオブジェクトである場合にのみ等しいと見なされることを意味します。

これを動作を見ていきましょう:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("Hello");
String key2 = new String("Hello");

identityMap.put(key1, "World1");
identityMap.put(key2, "World2");

System.out.println("IdentityHashMapのサイズ: " + identityMap.size());
System.out.println("key1の値: " + identityMap.get(key1));
System.out.println("key2の値: " + identityMap.get(key2));

出力:

IdentityHashMapのサイズ: 2
key1の値: World1
key2の値: World2

驚きましたか?key1とkey2は同じ内容("Hello")を持っていますが、IdentityHashMapはそれらを異なるキーとして扱います。なぜなら、それらはメモリ内の異なるStringオブジェクトですから。

この動作は、特定のシナリオでは非常に有用です。例えば、異なるバージョンのドキュメントを追跡するプログラムを書いているとします。各バージョンは同じタイトルを持っているかもしれませんが、それらを個別のエンティティとして扱いたい場合です。そのような場合、IdentityHashMapは完璧です!

結論として、IdentityHashMapはMapファミリーのクイッカーのような存在です。他のものと似ていますが、独自のやり方を持っています。何時に使用するかを理解することで、より多才なJavaプログラマになることができます。

覚えておいてください、プログラミングの世界には、一つのサイズであるすべての解決策はありません。各ツールにはその場所があり、IdentityHashMapを使用するタイミングを知ることは、あなたのJava知識の中のもう一つの矢です。続けて练习し、興味深いままに、幸せなコーディングを!

Credits: Image by storyset