こんにちは!エンジニアの中沢です。
JavaでMapを使用したいと思ったことはありませんか?Mapを初めて使う方は、宣言や初期化の方法で悩むかもしれません。今回は、Mapの宣言と初期化の方法を解説します!
この記事では、
- Mapとは
- Mapの宣言をする方法
- putで要素を追加する方法
- 宣言と同時に値を追加して初期化する方法
- unmodifiableMapメソッドでMapを定数化する方法
などの基本的な内容から、応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、Mapの宣言と初期化をする方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
Mapとは
Mapは二つの要素から成ります。
- 一つ目は「キー」と呼ばれる名前です
- 二つ目は「値」になります
「キー」は簡単にいえば、値につける名前だと思ってもらえば大丈夫です。値ひとつひとつに「キー」が存在しており、「キー」と「値」がペアになっているのがMapの特徴です。配列やListはインデックス番号で値を指定しますが、Mapの場合はキーで値を指定します。
Mapの宣言とputで要素を追加する方法
初めにnewを使ったMapのシンプルな宣言の方法と、putメソッドで要素を追加する方法を解説します。Mapの宣言と要素の追加方法を覚えるために次のプログラムを確認してみましょう。
import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("samurai", "侍"); map.put("engineer", "エンジニア"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
[実行結果]
samurai : 侍 engineer : エンジニア
ここではMapを宣言した後にputメソッドでキーと値を追加しています。これでMapの宣言と要素の追加ができました!
宣言と同時に値を追加して初期化する方法
先ほどはMapを宣言した後にputメソッドで要素を追加する方法を解説しましたが、ここでは宣言と同時に値を追加して初期化する方法を解説します。
匿名クラスで初期化する方法
Mapに要素をまとめて追加して初期化するには、匿名クラスを使う方法があります。注意点は、ダイヤモンド演算子(<>)の中の型を省略できないことです。匿名クラスで初期化する方法を次のプログラムを確認してみましょう。
import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>() { { put("samurai", "侍"); put("engineer", "エンジニア"); } }; for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
[実行結果]
samurai : 侍 engineer : エンジニア
このように匿名クラスを使うことでMapを初期化することができました!
staticイニシャライザを使う方法
ここではstaticイニシャライザを使って初期化する方法を解説します。staticイニシャライザはクラス内で使われるクラス変数を初期化するときに使います。次のプログラムでstaticイニシャライザの使い方を確認してみましょう。
import java.util.HashMap; import java.util.Map; public class Main { private static Map<String, String> map = new HashMap<>(); static { map.put("samurai", "侍"); map.put("engineer", "エンジニア"); } public static void main(String[] args) { for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
[実行結果]
samurai : 侍 engineer : エンジニア
このようにstaticイニシャライザを使うことでMapを初期化することができました!
宣言でこの書き方はアリ?ナシ?
次のような書き方でMapを初期化することはできるでしょうか?
Map<String, String> map = new Map<>();
実はこのような書き方ではインスタンスを生成できないため初期化ができません。基本的には次のように、Map型変数にHashMapオブジェクトを格納して使うと覚えましょう。
Map<String, String> map = new HashMap<>();
HashMapの他にもTreeMapやLinkedHashMapを目的に応じて使うことがありますが、基本的にはMapといえばHashMapを使います。
unmodifiableMapメソッドでMapを定数化する
最後にMapを定数として扱う方法を解説します。int型などを定数として扱いたい場合はfinal修飾子をつけることで値の変更ができない定数になります。
しかし、Mapの場合はfinal修飾子をつけても要素の追加などができてしまうため、unmodifiableMapメソッドを使って定数化します。次のプログラムで確認してみましょう。
import java.util.Collections; import java.util.HashMap; import java.util.Map; public class Main { private static final Map<String, String> MAP; static { Map<String, String> map = new HashMap<>(); map.put("samurai", "侍"); map.put("engineer", "エンジニア"); MAP = Collections.unmodifiableMap(map); } public static void main(String[] args) { for (Map.Entry<String, String> entry : MAP.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
[実行結果]
samurai : 侍 engineer : エンジニア
ここではstaticイニシャライザで初期化したMapにunmodifiableMapメソッドを使って定数化しています。このようにunmodifiableMapメソッドを使うことで値の変更を許可しないMapを作ることができました!
Mapの使い方総まとめ
Mapについてさらに詳しく知りたいときはこちらの記事を確認してください!
まとめ
いかがでしたか?
今回はMap(HashMap)の宣言と初期化をする方法について解説しました。Mapを定数として使う場合はfinal修飾子だけではなく、unmodifiableMapメソッドを使う必要があるので忘れないでくださいね。
もしMapの初期化と同時に値を追加する方法や、Mapを定数化する方法を忘れてしまったらこの記事を確認してください!