HashMapの使い方
HashMap クラスは Map インターフェースを実装したクラスの一つで、キーと値のペアをマップに追加します。マップに対してキーを指定することで、対応する値を取得することができます。ここでは Java における HashMap クラスの使い方について解説します。
※ HashMap クラスは java.util パッケージに含まれています。利用する場合は java.util.LinkedList をインポートしてください。
(Last modified: )
目次
HashMapクラスのインスタンスを作成する
最初に HashMap クラスのインスタンスを作成する方法です。 new 演算子を使って次のように作成します。
HashMap<キーのデータ型,値のデータ型> 変数名 = new HashMap<>();
HashMap クラスでは要素にキーと値をペアで格納します。そのため、キーのデータ型と値のデータ型をそれぞれ指定します。例えばキーに文字列、値に整数を格納する場合は次のように記述します。
HashMap<String,Integer> map = new HashMap<>();
なお HashMap は Map インターフェースを実装したクラスなので、次のように Map オブジェクトとして作成することもできます。 Map オブジェクトとして作成した場合は、 HashMap クラスでのみ定義されているメソッドは利用できなくなりますが、同じ Map インターフェースを実装したクラスへ変換する場合などに便利です。
Map<String,Integer> map = new HashMap<>();
主に使用するメソッドは Map インターフェースで定義されているので、通常は Map オブジェクトとして作成することが多いようです。(なお List オブジェクトとして作成する場合は java.util.Map をインポートしてください)。
なおデータ型には基本データ型である int や double などは指定することができません。これらの数値を格納したい場合には、それぞれの基本データ型に対応したラッパークラスを使用してください。(ラッパークラスについての詳細は「ラッパークラスの利用」を参照されてください)。
基本データ型 | ラッパークラス |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
キーと値のペアをマップに追加する(put)
マップに新しいキーと値のペアを追加するには HashMap クラスで用意されている put メソッドを使います。書式は次のとおりです。
public V put(K key, V value)
パラメータ: key - 指定された値が関連付けられるキー value - 指定されたキーに関連付けられる値 戻り値: keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull。 (戻り値nullは、マップが以前にnullとkeyを関連付けていたことを示す場合もある) 定義: インタフェース: Map<K,?V>
引数に指定したキーと値のペアをマップに追加します。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90);
3 つのキーと値のペアをマップに追加しました。
なお Integer クラスなど基本データ型のラッパークラスのオブジェクトを格納するリストの場合、厳密には要素を追加するときに put メソッドの引数に Integer クラスのインスタンスを指定します。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",Integer.valueOf(80));
ただラッパークラスにはオートボクシングという機能が利用できます。これは本来ラッパークラスのインスタンスを記述すべきところにラッパークラスに対応した基本データ型の値を記述すると、自動で変換してくれるというものです。よって、 Integer クラスのインスタンスを作成して追加しなくても、次のように int 型の値をそのまま記述することができます。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80);
追加済みのキーに新しい値をセットする
マップには同じキーを複数追加することはできません。そのため put メソッドの引数に既にマップに追加されているキーを指定すると、新しいキーとペアが追加されるのではなく既存のキーとペアの値が新しい値に変更されます。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.get("リンゴ")); // 80 map.put("リンゴ",140); System.out.println(map.get("リンゴ")); // 140
マップにはキーが "リンゴ" で値が 80 のペアがすでに追加されていますが、そのあとでキーが "リンゴ" で値が 140 のペアを追加しました。この場合、すでに追加されているキーが "リンゴ" の値が 140 に変更されます。
指定したキーが存在しない場合だけキーと値のペアを追加する(putIfAbsent)
put メソッドでは引数に指定したキーがマップに存在しない場合にはキーと値のペアを新しくマップに追加し、キーがマップに存在する場合にはキーに対する値を新しい値に変更しました。
Map インターフェースで用意されている putIfAbsent メソッドを使用すると、引数に指定したキーがマップに存在しない場合はキーと値のペアを新しくマップに追加しますが、キーがマップに存在する場合は何もしませえん。 putIfAbsent メソッドの書式は次のとおりです。
default V putIfAbsent(K key, V value)
パラメータ:
key - 指定された値が関連付けられるキー value - 指定されたキーに関連付けられる値 戻り値: 指定されたキーに関連付けられた以前の値。キーのマッピングがなかった場合はnull。 (また、実装がnull値をサポートしている場合、戻り値nullは、以前にマップでキーとnullが関連付けられていたことを示す場合もある。) 例外: UnsupportedOperationException - put操作がこのマップでサポートされない場合(オプション) ClassCastException - キーまたは値がこのマップに適さない型の場合(オプション) NullPointerException - 指定されたキーまたは値がnullであり、かつこのマップがnullのキーまたは値を許可しない場合(オプション) IllegalArgumentException - 指定されたキーまたは値のなんらかのプロパティが、それらがこのマップに格納されるのを妨げる場合(オプション)
引数に指定したキーがマップに存在しない場合、引数に指定したキーと値のペアをマップに追加します。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.putIfAbsent("オレンジ",120); System.out.println(map.get("オレンジ")); // 120 map.putIfAbsent("オレンジ",90); System.out.println(map.get("リンゴ")); // 90
指定したキーがマップに存在しない場合には新しくキーとマップのペアがマップに追加されますが、キーがマップに既に存在した場合はペアを追加したり新しい値に変更することもなく何も行いません。
マップに追加されているキーと値のペアの数を返す(size)
マップに追加されているキーと値のペアの数を取得するには HashMap クラスで用意されている size メソッドを使います。書式は次のとおりです。
public int size()
戻り値: このマップ内のキーと値のマッピングの数 定義: インタフェース: Map<K,?V>
メソッドを呼び出すと、現在マップに追加されているキーと値のペアの数を戻り値として返します。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); System.out.println(map.size()); // 0 map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.size()); // 3
マップを作成した直後はペアの数が 0 です。 put メソッドを使ってキーと値のペアを 3 つ追加したあとで再度確認してみるとペアの数は 3 となっています。
指定したキーとペアの値を取得する(get)
マップに追加されているキーと値のペアの中で、指定したキーとペアの値を取得する HashMap クラスで用意されている get メソッドを使います。書式は次のとおりです。
public V get(Object key)
パラメータ: key - 関連付けられた値が返されるキー 戻り値: 指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合はnull 定義: インタフェース: Map<K,?V>
引数に指定したキーとペアの値を戻り値として取得します。マップの中に指定したキーが存在しない場合は null が返されます。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.get("オレンジ")); // 120 System.out.println(map.get("メロン")); // null
キー "オレンジ" はマップの中に存在するため、ペアの値である 120 が戻り値として返されます。それに対してキー "メロン" はマップに存在しないため null が返されます。
なおマップには値として null を持つペアを登録することもできます。そのため、 null が戻り値として返された場合でもマップにキーが存在しないのか、それとも指定したキーに対応する値が null なのかは分かりません。
指定したキーが存在しない場合にデフォルト値を返す(getOrDefault)
get メソッドでは引数に指定したキーがマップに存在しない場合 null が返されます。 Map インターフェースで用意されている getOrDefault メソッドを使用すると引数に指定したキーがマップに存在した場合はキーとペアの値を返し、キーがマップに存在しない場合はデフォルト値と指定した値を返すことができます。書式は次のとおりです。
default V getOrDefault(Object key, V defaultValue)
パラメータ: key - 関連付けられた値が返されるキー defaultValue - キーのデフォルト・マッピング 戻り値: 指定されたキーがマップされている値。このマップにそのキーのマッピングが含まれていない場合はdefaultValue 例外: ClassCastException - このキーがこのマップに適さない型の場合(オプション) NullPointerException - 指定されたキーがnullであり、このマップがnullキーを許可しない場合(オプション)
1 番目の引数に指定したキーとペアの値を戻り値として取得します。もしマップに引数に指定したキーが存在しない場合は、 2 番目の引数に指定した値を戻り値として返します。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); System.out.println(map.get("メロン")); // null System.out.println(map.getOrDefault("メロン", 0)); // 0
キー "メロン" はマップに存在しないため、 get メソッドの場合は null が返されますが getOrDefault? メソッドの場合はデフォルト値として指定した 0 が返されます。
マップからキーと値のペアを削除する(remove,clear)
マップに追加されているキーと値のペアを削除するには HashMap クラスで用意されている remove メソッドを使います。書式は次のとおりです。
public V remove(Object key)
パラメータ: key - マッピングがマップから削除されるキー 戻り値: keyに以前に関連付けられていた値。keyのマッピングが存在しなかった場合はnull。 (戻り値nullは、マップが以前にnullとkeyを関連付けていたことを示す場合もある) 定義: インタフェース: Map<K,?V>
引数に指定したキーと一致するキーと値のペアをマップから削除します。指定したキーがマップに存在しなくてもエラーにはなりません。
またマップに追加されているすべてのキーと値のペアを削除するには HashMap クラスで用意されている clear メソッドを使います。書式は次のとおりです。
public void clear()
-- 定義: インタフェース: Map<K,?V>
このメソッドを呼びだすと、マップに追加されているキーと値のペアをすべて削除します。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.size()); // 3 map.remove("オレンジ"); System.out.println(map.size()); // 2 map.clear(); System.out.println(map.size()); // 0
remove メソッドを使ってキーと値のペアを一つ削除したあとで、マップに残っているすべてのキーと値のペアを clear メソッドで削除しました。
マップに指定したキーまたは値が存在するか確認する(containsKey,containsValue)
マップに指定したキーが存在しているかどうか確認するには HashMap クラスで用意されている containsKey メソッドを使います。書式は次のとおりです。
public boolean containsKey(Object key)
パラメータ: key - このマップ内にあるかどうかが判定されるキー 戻り値: このマップが指定のキーのマッピングを保持する場合はtrue 定義: インタフェース: Map<K,?V>
引数に指定したキーがマップに存在していた場合 true を返します。存在していなかった場合は false を返します。
同じようにマップに指定した値が存在しているかどうか確認するには HashMap クラスで用意されている containsValue メソッドを使います。書式は次のとおりです。
public boolean containsValue(Object value)
パラメータ: value - このマップにあるかどうかが判定される値 戻り値: このマップが1つまたは複数のキーを指定された値にマッピングしている場合はtrue 定義: インタフェース: Map<K,?V>
引数に指定した値がマップに存在していた場合 true を返します。存在していなかった場合は false を返します。なおマップでキーは重複することはできませんが、値は同じ値が複数存在することもあります。
次のサンプルをみてください。
Map<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.containsKey("ブドウ")); // true System.out.println(map.containsValue(100)); // false
"ブドウ" というキーはマップに存在していますが、 100 という値はマップには存在していません。
それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample3-1.java という名前で保存します。
import java.util.HashMap; import java.util.Map; class JSample3_1{ public static void main(String[] args){ HashMap<String,Integer> map = new HashMap<>(); map.put("リンゴ",80); map.put("オレンジ",120); map.put("ブドウ",90); System.out.println(map.get("ブドウ")); System.out.println(map.get("リンゴ")); } }
コンパイルを行います。
javac -encoding UTF-8 JSample3_1.java
その後で、次のように実行してください。
java JSample3_1
HashMap クラスから Map オブジェクトを作成し、キーと値のペアをいくつか追加したあとで、キーを指定して対応する値を取得しました。
-- --
Java における HashMap クラスの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。