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
| 特徴 | HashMap | LinkedHashMap |
|---|---|---|
| 順序 | 保証されない | 挿入順序が保持される |
| パフォーマンス | ランダムアクセスにおいて高速 | 順序管理のため、わずかに低速 |
| 重複 | キーはユニークである必要あり | キーはユニークである必要あり |
ヒント: エントリが追加された順序をマップに記憶させておきたい場合は、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 インターフェース
注意: 実務のコードでは、次のように Map と LinkedHashMap の両方が同時に使われているのをよく目にします。
9.1 インターフェースを用いた宣言例
import java.util.Map;
import java.util.LinkedHashMap;
Map<String, String> capitalCities = new LinkedHashMap<>();これは、変数(capitalCities)が Map(インターフェース)として宣言され、そこに実際のオブジェクトである LinkedHashMap を格納していることを意味します。LinkedHashMap は Map インターフェースを実装しているため、このようなポリモーフィズムを利用した柔軟な設計が可能です。