[Javaの基礎]Mapについて
はじめに
ここでは以下についてまとめています。
- Map
- Mapで使用されるメソッド
Mapとは
JavaのMap
は、キー(key)と値(value)のペアを格納するデータ構造です。キーは一意である必要があり、それに対応する値を保持します。JavaではMap
はインターフェースであり、主に以下のような実装があります。ここではHashMap
を使用します。
クラス名 | 説明 |
---|---|
HashMap |
高速なアクセス・要素の順序なし・nullキー/値を許容 |
LinkedHashMap |
挿入順を保持 |
TreeMap |
キーの自然順または指定Comparatorによる順序付け |
Hashtable |
古い実装・同期化されているが非推奨 |
ConcurrentHashMap |
スレッドセーフなHashMap ・並行処理に最適 |
使用方法
以下のようにMap<String, Integer> map = new HashMap<>();
と宣言します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
int count = map.get("apple"); // 3
boolean contains = map.containsKey("banana"); // true
map.remove("banana"); // "banana"エントリ削除
不変マップを作成するにはMap.of()
メソッドを使用します。
不変マップでput
などを行うとエラーになります。
Map<String, Integer> map = Map.of(
"apple", 3,
"banana", 5
);
よく使用されるメソッド
put
要素の追加や更新をします。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
map.put("apple", 4); // apple の値を上書き
System.out.println(map); // {banana=5, apple=4}
get
キーに対応する値を取得します。キーが存在しない場合はnull
が返ります。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
Integer count = map.get("apple"); // 3
getOrDefault
キーが存在しない場合に指定したデフォルト値を返します。
get
メソッドはキーが存在しない場合にnull
が返るのでこちらの方が使用頻度は高いです。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
Integer count1 = map.getOrDefault("apple", 0); // 3
Integer count2 = map.getOrDefault("banana", 0); // 0
remove
キーに対応する要素を削除します。
Map<String, Integer> map = new HashMap<>();
map.put("orange", 2);
map.remove("orange");
System.out.println(map); // {}
removeIf
Map
にはremoveIf
を直接使用できませんが、entrySet()
から使用できます。
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 80);
scores.put("Bob", 40);
scores.put("Charlie", 90);
scores.entrySet().removeIf(entry -> entry.getValue() < 50);
System.out.println(scores); // → {Alice=80, Charlie=90}
containsKey
キーが存在するかチェックします。boolean
型を返します。
Map<String, Integer> map = new HashMap<>();
map.put("banana", 5);
if (map.containsKey("banana")) {
System.out.println("bananaは存在します。");
}
containsValue
値が存在するかチェックします。boolean
型を返します。
Map<String, Integer> map = new HashMap<>();
map.put("orange", 2);
if (map.containsValue(2)) {
System.out.println("2個の果物が存在します。");
}
size
要素数を取得します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
System.out.println(map.size()); // 2
clear
すべての要素を削除します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.clear();
System.out.println("要素数: " + map.size()); // 0
isEmpty
空かどうかを確認します。boolean
型を返します。
Map<String, Integer> map = new HashMap<>();
if (map.isEmpty()) {
System.out.println("Mapは空です。");
}
ketSet()
キーの一覧を取得します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
for (String key : map.keySet()) {
System.out.println("キー: " + key);
}
values
値の一覧を取得します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
for (Integer value : map.values()) {
System.out.println("値: " + value);
}
entrySet
キーと値のペアを取得します。全要素に対してループ処理を行う際に使用します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue()); // apple -> 3 banana -> 5
}
forEach
entrySet
メソッドのようにマップの全要素に対してループ処理を行う際に使用します。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
map.forEach((key, value) -> {
System.out.println(key + " -> " + value); // apple -> 3 banana -> 5
})
computeIfAbsent
- キーが存在しないときに初期値を設定したい
- null チェックなしで安全に値を入れたい
- Mapに対して「値の遅延生成」や「初期化」をスマートに書きたい
特に「キーが存在しないときに値を計算して追加する」ような処理に非常によく使用します。
使用例
以下では"fruits"
というキーがない場合はnew ArrayList<>()
が作られてmap.put("fruits", List)
されています。
すでにあれば、そのリストにapple
を追加します。
Map<String, List<String>> map = new HashMap<>();
// "fruits" というキーがなければ、新しく ArrayList を生成して追加
map.computeIfAbsent("fruits", key -> new ArrayList<>()).add("apple");
System.out.println(map); // → {fruits=[apple]}
Discussion