【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"); // 222getOrDefault
getOrDefaultは指定したキーが要素として存在しない場合に、第二引数で指定したデータを返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.getOrDefault("AAA", 333); // 111
map.getorDefault("CCC", 333); // 333size
sizeはMapの要素数を返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.size(); // 2isEmpty
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(); // truekeySet
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"); //falsecontainsValue
containsValueは指定したデータがMapに存在するかを判定し、その結果を真偽値で返します。
Map<String, Integer> map = new HashMap<>();
map.put("AAA", 111);
map.put("BBB", 222);
map.containsValue(111); //true
map.containsValue(333); //falseMap の削除
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の結果で決まります。