Javaで、複数のデータをまとめて扱いたいケースが発生した際に、使用できる方法はいくつか存在します。
その中でも、特定の項目ごとに関連するデータを紐付けて管理したい場合に便利なのが、Mapです。
今回は、Javaの Mapを使用する方法について、詳しく解説していきたいと思います。
Mapとは?
Mapは、Javaで使用可能なインターフェースの1つであり、複数のデータを一塊のオブジェクトとして管理することができる機能のことを言います。
同じくデータ集合を扱う代表的なインターフェースに Listがありますが、各データをインデックスで管理する Listとは異なり、キー (Key) と値 (value) の組み合わせによって管理するのが Mapの大きな特徴です。
それぞれのデータに紐付けるキーは重複不可となっている (一意である) ため、特定の項目ごとに関連するデータを格納したい場合に活用することができます。
Mapを実際に使用する際は、実装クラスである HashMap などを利用してオブジェクトを作成します。
主要なMap実装クラスの特徴
Mapの主な実装クラスには、以下の3つがあります。
- HashMap
- TreeMap
- LinkedHashMap
それぞれの特徴について解説します。
高速な検索が可能なHashMap
HashMapは、最も一般的に使用されている実装クラスです。
キーをハッシュ値に変換してデータ管理することにより、高速なアクセスを実現しているのが主な特徴です。
格納した要素の順序付けはされないため、追加順やソート順など、要素の並び順を意識する必要がある場合は、後述するクラスを使用する必要があります。
また、キーに nullを1つだけ許容する点も HashMapの特徴の1つです。
キーを自動ソートして保持するTreeMap
TreeMapは、キーを自然順、または指定の比較方法によって自動的にソートする実装クラスです。
内部構造にツリーマップを採用しており、特定の条件に沿って常にキーが整列されている状態を維持します。
キーの並び順が重要な場合や、範囲検索を行いたい場合などに適していますが、HashMapと比べると処理速度はやや遅くなる傾向にあります。
そのため、並び順に重要性はなく、処理速度を重視する場合には、HashMapの方が使用に適しています。
挿入順を維持するLinkedHashMap
LinkedHashMapは、HashMapの基本的な特性を持ちつつ、要素の挿入順を維持する実装クラスです。
各要素をリンクして繋げることにより、追加された順序に沿ってデータを取り出すことを可能としています。
例えばキャッシュなど、データの保存順を重要視する場面での使用に適しています。
要素の順序を保ちつつ、高速処理を行いたい場合に有効です。
Mapを初期化する
Mapを初期化する方法は、主に2通りあります。
それぞれ確認していきましょう。
new HashMapでマップを作成する
基本的な初期化方法は、new演算子を使用して空のMapを作成する方法です。
Map<String, String> map = new HashMap<>();作成したインスタンスに、後から値を追加する形で使用します。
柔軟性が高く、データを動的に扱う場合に適しています。
Map.of()で不変マップを作成する
Map.of() を使用することで、初期値を指定した状態で Mapを作成することができます。
Map<String, String> map = Map.of(
"name", "Taro",
"job", "engineer"
);Map.of() で作成したMapは不変 (イミュータブル) となるため、後から要素の追加・削除・変更を行うことはできません。
そのため、定数データや変更の必要がない設定値を管理するのに適しています。
マップの基本操作
Mapの操作は、既存で用意されている様々なメソッドを使用して行うことができます。
メソッドごとの操作内容について見ていきましょう。
データの追加(put)、取得(get)、削除(remove)
データを追加する際には、putメソッドを使用します。
引数にキーと値をそれぞれ指定することで、要素を新しく追加することができます。
Map<String, String> map = new HashMap<>();
map.put("name", "Taro");
map.put("job", "engineer");
System.out.println(map);{name=Taro, job=engineer}指定したキーが既に存在する場合は、値が上書きされます。
追加した要素を取得する場合は、getメソッドを使用します。
引数にキーを指定することで、対応する値を取得することができます。
Map<String, String> map = new HashMap<>();
map.put("name", "Taro");
map.put("job", "engineer");
String name = map.get("name");
System.out.println(name);Taro存在しないキーを指定した場合は nullが返されるため、使用の際は nullの扱いに注意する必要があります。
既存の要素を削除したい場合は、removeメソッドを使用することで、指定したキーに対応する要素を削除することができます。
Map<String, String> map = new HashMap<>();
map.put("name", "Taro");
map.put("job", "engineer");
System.out.println(map);
map.remove("job");
System.out.println(map);{name=Taro, job=engineer}
{job=engineer}キーや値の確認(containsKey、containsValue)
特定のキーや値が存在するかを確認したい場合に使用できるのが、containsKeyメソッドと containsValueメソッドです。
Map<String, String> map = new HashMap<>();
map.put("name", "Taro");
map.put("job", "engineer");
// キーの存在を確認
boolean isKey = map.containsKey("name");
// 値の存在を確認
boolean isValue = map.containsValue("teacher");
System.out.println(isKey);
System.out.println(isValue);true
false特に、getメソッドで nullが返された場合の原因の判定などに有効的です。
getメソッドの結果のみでは、キーが存在しないのか、値が nullなのかの判断がつかないため、上記のメソッドを使用することで具体的な理由を解明することができます。
forEachメソッドで簡潔にループ処理する
複数行に渡るような複雑な処理を行わない場合には、forEachメソッドとラムダ式を組み合わせた方法を使用すると、より簡潔にコードを記述することができます。
Map<String, String> map = new HashMap<>();
map.put("name", "Taro");
map.put("job", "engineer");
map.forEach((key, value) -> System.out.println(key + ":" + value));処理内容によって使用可能か否かは異なるので、状況に合わせて適した方法で記述するといいでしょう。
まとめ
いかがでしたか?今回は、Javaの Mapを使用する方法について解説しました。
データ処理を行う上で、Mapはよく利用される方法の1つとなるため、使い方をしっかりと把握しておくことが大切です。
ぜひこの記事も参考にしながら、実際にコードを書くなどして理解を深めていってください。
Javaの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Javaに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。