Java アドバンス

Java LinkedHashMap

LinkedHashMap は、キー(Key)と値(Value)を保存し、それらを追加した順序(挿入順)のまま保持するコレクションです。

このクラスは java.util パッケージに含まれており、Map インターフェースを実装しています。

       ヒント: イテレーション(繰り返し処理)の順序を予測可能(挿入順)にしたい場合は、LinkedHashMap を選択してください。

1. LinkedHashMap の作成

String 型のキーと String 型の値を格納する、capitalCities という名前の LinkedHashMap オブジェクトを作成する例です。

1.1 作成の例

import java.util.LinkedHashMap; // LinkedHashMap クラスをインポート

LinkedHashMap<String, String> capitalCities = new LinkedHashMap<>();

作成後は、put() を使ったペアの追加、get() を使ったキーによる値の取得、remove() を使ったエントリの削除などが可能です。これらはすべて挿入順序を維持したまま行われます。

2. 要素の追加

LinkedHashMap にアイテムを追加するには、put() メソッドを使用します。

2.1 追加のコード例

// LinkedHashMap クラスをインポート
import java.util.LinkedHashMap;

public class Main {
  public static void main(String[] args) {
    LinkedHashMap<String, String> capitalCities = new LinkedHashMap<>();

    capitalCities.put("England", "London");
    capitalCities.put("India", "New Dehli");
    capitalCities.put("Austria", "Wien");
    capitalCities.put("Norway", "Oslo");
    capitalCities.put("Norway", "Oslo"); // 重複
    capitalCities.put("USA", "Washington DC");

    System.out.println(capitalCities);
  }
}

出力結果: アイテムは追加された順序で表示されます(例: {England=London, India=New Dehli, Austria=Wien, Norway=Oslo, USA=Washington DC})。
注意: "Norway" のような重複したキーは無視(または値が更新)されます。

3. 要素へのアクセス

関連付けられた値を取得するには、キーを指定して get() メソッドを使用します。

3.1 アクセスの例

capitalCities.get("England");

4. 要素の削除

キーを指定してアイテムを削除するには、remove() メソッドを使用します。

4.1 削除の例

capitalCities.remove("England");

すべてのアイテムを削除するには、clear() メソッドを使用します。

4.2 全削除の例

capitalCities.clear();

5. LinkedHashMap のサイズ

マップ内にいくつのキー・バリュー・ペアがあるかを確認するには、size() メソッドを使用します。

5.1 サイズ確認の例

capitalCities.size();

注意: サイズはユニークなキーの数のみをカウントします。同じキーが複数回追加された場合、最新の値のみが保持されます。

6. LinkedHashMap のループ処理

for-each ループを使用して LinkedHashMap をループ処理できます。以下のメソッドを使い分けましょう。

  • keySet(): すべてのキーを取得
  • values(): すべての値を取得

6.1 キーをプリントする例

// キーを表示
for (String key : capitalCities.keySet()) {
  System.out.println(key);
}

6.2 値をプリントする例

// 値を表示
for (String value : capitalCities.values()) {
  System.out.println(value);
}

6.3 キーと値を両方プリントする例

// キーと値を表示
for (String key : capitalCities.keySet()) {
  System.out.println("Key: " + key + ", Value: " + capitalCities.get(key));
}

7. HashMap vs LinkedHashMap

特徴HashMapLinkedHashMap
順序保証されない挿入順序が保持される
パフォーマンスランダムアクセスにおいて高速順序管理のため、わずかに低速
重複キーはユニークである必要ありキーはユニークである必要あり

       ヒント: エントリが追加された順序をマップに記憶させておきたい場合は、LinkedHashMap を使用してください。

8. var キーワード

Java 10 以降では、型を2回書かずに var キーワードを使用して LinkedHashMap 変数を宣言できます。コンパイラは代入された値から型を推論します。

これによりコードは短くなりますが、明快さを求めてフルタイプ(完全な型名)を使い続ける開発者も多いです。モダンな Java 開発では var は一般的ですので、知識として持っておくと役立ちます。

8.1 var を使用した例

// var を使用しない場合
LinkedHashMap<String, String> capitalCities = new LinkedHashMap<String, String>();

// var を使用する場合
var capitalCities = new LinkedHashMap<String, String>();

9. Map インターフェース

注意: 実務のコードでは、次のように MapLinkedHashMap の両方が同時に使われているのをよく目にします。

9.1 インターフェースを用いた宣言例

import java.util.Map;
import java.util.LinkedHashMap;

Map<String, String> capitalCities = new LinkedHashMap<>();

これは、変数(capitalCities)が Map(インターフェース)として宣言され、そこに実際のオブジェクトである LinkedHashMap を格納していることを意味します。LinkedHashMapMap インターフェースを実装しているため、このようなポリモーフィズムを利用した柔軟な設計が可能です。