🐕

[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