【Java】Mapの基本
Map とは
Java で複数のデータを扱う場合、配列やList
を使用することが多いと思います。
これらのデータはインデックスによって紐づけられています。
String[] ary = {"AAA", "BBB", "CCC"};
System.out.println(ary[1]); // BBB
これに対し今回の題材であるMap
は、自身で決めたキーにデータを紐づけます。
例えば ID から対象のデータを取得したい場合、配列やList
はその ID からインデックスを検索してから取得します。
一方、Map
ではキーを ID にしておけば簡単にデータを取得することができます。
それではMap
の基本的な使用方法について説明していきます。
Map の宣言
Map
はインターフェースのため、いくつかの実装クラスを持ちます。
実装クラスについては後述するとして、ひとまずここではHashMap
を用います。
Map
の宣言にはジェネリクス<>
を使用し、キーとデータのクラスを指定します。
int
などの基本データ型を使用する際は、Integer
のようなラッパークラスを使用します。
Map<String, Integer> map = new HashMap<String, Integer>();
右辺のジェネリクスは省略することが可能です。
Map<String, Integer> map = new HashMap<>();
Map の追加
put
Map
にデータを追加するにはput
を使用します。
第一引数にキー、第二引数にデータを指定します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
putIfAbsent
putIfAbsent
は、指定したキーがMap
に存在していない場合のみ要素を追加します。
put
の場合、同一キーを指定するとデータが置換されます。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.put("AAA", 333); // 333に置換される
map.putIfAbsent("BBB", 444); // 222のまま
putAll
putAll
は、別のMap
の要素をすべて追加します。
もちろんジェネリクスの定義が同じものに限ります。
Map<String, Integer> map1 = new HashMap<>();
map1.put("AAA", 111);
map1.put("BBB", 222);
Map<String, Integer> map2 = new HashMap<>();
map2.put("CCC", 333);
map2.put("DDD", 444);
map1.putAll(map2);
Map の参照
get
get
はキーを指定することで、対応するデータを返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.get("AAA"); // 111
map.get("BBB"); // 222
getOrDefault
getOrDefault
は指定したキーが要素として存在しない場合に、第二引数で指定したデータを返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.getOrDefault("AAA", 333); // 111
map.getorDefault("CCC", 333); // 333
size
size
はMap
の要素数を返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.size(); // 2
isEmpty
isEmpty
は、Map
の要素数が 0 であることを判定し、その結果を真偽値で返します。
Map<String, Integer> map1 = new HashMap<>();
map1.put("AAA", 111);
map1.put("BBB", 222);
map1.isEmpty(); // false
Map<String, Integer> map2 = new HashMap<>();
map2.isEmpty(); // true
keySet
keySet
はすべてのキーをSet
に変換して返します。用途としては、キーでループしたい場合に使用します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
for (String key : map.keySet()) {
System.out.println(map.get(key));
}
values
values
はすべてのデータをList
に変換して返します。
Map の置換
replace
replace
は、指定したキーの要素が存在する場合に、そのデータを置換します。
put
でも置換ができますが、指定したキーがない場合に要素を追加するかどうかが違います。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.replace("AAA", 333); // 333に置換される
map.replace("CCC", 444); // mapに影響を及ぼさない
replace
はキーのみでなく、キーとデータのセットを置換条件とすることもできます。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.replace("AAA", 111, 333); // 333に置換される
map.replace("BBB", 333, 444); // ("BBB",333)に一致する要素がないため置換されない
Map の検索
containsKey
containsKey
は指定したキーがMap
に存在するかを判定し、その結果を真偽値で返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.containsKey("AAA"); //true
map.containsKey("CCC"); //false
containsValue
containsValue
は指定したデータがMap
に存在するかを判定し、その結果を真偽値で返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.containsValue(111); //true
map.containsValue(333); //false
Map の削除
clear
clear
はMap
の要素をすべて削除し、空の状態(要素数を 0)にします。
remove
remove
は指定したキーの要素を削除します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.remove("AAA");
キーのみでなく、キーとデータのセットを削除条件にすることもできます。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.remove("AAA", 111); //削除される
map.remove("BBB", 333); //削除されない
Map の種類
Map
の実装クラスには、これまで使用してきたHashMap
の他に LinkedHashMap
やTreeMap
があります。
宣言についてはどれも同じで、これら 3 つの違いは要素の格納順になります。 当然順序が保証されるされないで性能の差がありますので、使用する際は注意が必要です。
クラス | 格納順 |
---|---|
HashMap | 決まりはなし |
LinkedHashMap | 格納順 |
TreeMap | キーの昇順 |
TreeMap
のキーの昇順は、Comparable
のクラスで実装されたcompareTo
の結果で決まります。