java.svg

【Java】Mapの基本

Java

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

sizeMapの要素数を返します。

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

clearMapの要素をすべて削除し、空の状態(要素数を 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の他に LinkedHashMapTreeMapがあります。

宣言についてはどれも同じで、これら 3 つの違いは要素の格納順になります。 当然順序が保証されるされないで性能の差がありますので、使用する際は注意が必要です。

クラス格納順
HashMap決まりはなし
LinkedHashMap格納順
TreeMapキーの昇順

TreeMapのキーの昇順は、Comparableのクラスで実装されたcompareToの結果で決まります。