Javaコラム Javaエンジニアのためのお役立ちコラム

Java

そもそもJavaのMapとは?便利なJavaのMapをマスターしよう!

2020年10月27日
SE
JavaのMapとはどのようなものなのでしょうか。
PM
キーとそれに紐づいた値を扱うのに適したインターフェイスです。

JavaのMapとは?


JavaのMapは以下の例のような、キーとそれに紐づいた値を扱うのに適したインターフェイスです。一言で言うと辞書的な機能を持っているということです。Mapのような仕組みを連想配列とも言います。

キー:””Java”” 値:””Oracleが提供するオブジェクト指向言語。””
キー:””C#”” 値:””Microsoftが提供するオブジェクト指向言語。””

この記事ではMapインターフェイスを実装した便利なクラスを紹介するので、是非ご覧ください。

HashMapの宣言

Mapを実装したクラスで多く使われるのはHashMapです。以下のように宣言します。なおMapを利用するにはJavaソースの先頭に「import java.util.*;」を追加してください。

Map<String,String> map = new HashMap<String,String>();

Stringが2つありますが、最初のStringはキーの型で、次のStringは値の型です。なおJava 10から型推論ができるようになったため、右側の型指定は以下のように省略できるようになりました。

Map<String,String> map = new HashMap<>();

HashMapの格納と取得

以下がHashMapのデータの格納と取得の方法です。putでキーと値を格納し、getでキーを指定して取得して、値を表示しています。

Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.put(“”C#””, “”Microsoftの言語””);
String value = map.get(“”Java””);
System.out.println(value);

実行結果は以下が表示されます。

Oracleの言語

HashMapの中身を全て取得する

上のJavaサンプルのように1つだけ取得するのではなく、全てのデータを取得するにはどうしたら良いのでしょうか。サンプルに以下を追加しましょう。

for (Map.Entry<String,String> e : map.entrySet()) {
System.out.println(e.getKey() + “” “” + e.getValue());
}

実行すると以下のように表示されます。entrySetメソッドでEntryインターフェイスの型としてペアで取得できるということです。

C# Microsoftの言語
Java Oracleの言語

forEachメソッドとラムダ式

上のJavaサンプルは拡張for文を使ってHashMapの中身を表示しましたが、forEachメソッドとラムダ式を使う方法もあります。上と同じ事を以下でも実現できます。

map.forEach((key, value) -> {
System.out.println(key +”” “” + value);
});

なおキーだけを取得する場合はkeySet、値だけを取得する場合はvaluesで以下のように
します。

for (String key : map.keySet()) {
System.out.println(key);
}
for (String value : map.values()) {
System.out.println(value);
}

HashMapの更新

HashMapは同じキーで値の違うデータをputすると、上書きされます。キーは重複を許容しないということです。値を変えたい場合は再度putすれば良いということですが、変更する意図を明示した方が良いので、以下のJavaサンプルのようにreplaceを使うべきでしょう。

Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.replace(“”Java””, “”オブジェクト指向言語””);
System.out.println(map.get(“”Java””));

map.replace(“”Java””, “”オブジェクト指向言語””, “”Oracleのオブジェクト指向言語””);
System.out.println(map.get(“”Java””));

2つ目のreplace(A,B,C)は「キーAの値がBだった場合、Cに変更する」と言う意味です。

実行すると以下が表示されます。

オブジェクト指向言語
Oracleのオブジェクト指向言語

HashMapの削除

HashMapの中身を削除するには以下のようにremoveメソッドを使用します。

Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.remove(“”Java””);
System.out.println(map.get(“”Java””));

map.put(“”Java””, “”Oracleの言語””);
map.remove(“”Java””, “”Oracleの言語””);
System.out.println(map.get(“”Java””));
System.out.println(map.size()+”” “”+map.isEmpty());

2つ目のremove(A,B)は「キーAの値がBだった場合、削除する」と言う意味です。最後にHashMapの要素数と、空になっているかどうかを表示しています。実行結果は以下になります。

null
null
0 true

なお以下のようにclearを使うと中身を全て削除できます。

map.clear();

HashMapの値チェック

HashMapの中身に指定したキーや値があるかどうかは以下のようにします。

Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
if (map.containsKey(“”Java””)) System.out.println(“”キーがあります。””);
if (map.containsValue(“”Oracleの言語””)) System.out.println(“”値があります。””);

キーがあるかどうかはgetしてnullが返るかどうかでチェックすればいいのでは、と思うかもしれませんが、以下のようにkeyが存在しているものの値がnullということもありえます。

map.put(“”Java””, null);

TreeMapはキーを自動的にソートしてくれる

JavaにはHashMapとは別にTreeMapというクラスもあります。使い方はHashMapと同じですが、キーを自動的にソートしてくれるという違いがあります。

TreeMap<Integer,String> map = new TreeMap<>();
map.put(3, “”花子””);
map.put(1, “”太郎””);
map.put(2, “”二郎””);
map.forEach((key, value) -> {
System.out.println(key +”” “” + value);
});

実行すると以下のようにキーが昇順にソートされているのがわかります。

1 太郎
2 二郎
3 花子

ただしHashMapでもソートされている場合もあります。それでもHashMapはソートされることが保証されてはいません。

SE
JavaのMapを今まで使用したことがありませんでしたが、これほど便利なインターフェイスだったのですね。
PM
Mapはキーと値のペアになっているデータを扱う時には欠かせない機能です。是非マスターしておきましょう。

JavaのMapはとても便利!

JavaのMapについて解説しましたが、ご理解頂けましたでしょうか。キーと値のペアになっているデータを扱う時には欠かせない機能なので、是非マスターしてください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags

Jobs