Java - Map インターフェースと関連クラス
Map インターフェース
Map インターフェースは、データを保存するために別のオブジェクトをキー値として指定し、key-value を 1 つのペアとして保存して管理する Collection である。キーオブジェクトの重複は許可しないが、データの重複は許可する。インデックスを管理しないため、ソートなどの処理には適していない。Map インターフェースを実装した下位クラスには HashMap、LinkedHashMap、TreeMap がある。
- Map
- HashMap
- LinkedHashMap
- SortedMap
- TreeMap
- HashMap
Map メソッド
| メソッド | 説明 |
|---|---|
void clear() |
Map に保存されたオブジェクトを削除する。 |
boolean containsKey(Object key) |
指定したキー(key)が存在するかどうかを返す。 |
boolean containsValue(Object value) |
指定した値(value)が存在するかどうかを返す。 |
V get(Object key) |
指定したキー(key)に該当するデータを返す。 |
boolean isEmpty() |
Map が空かどうかを返す。 |
Set<K> keySet() |
key の一覧を Set オブジェクト形式で返す。 |
V put(K key, V value) |
キー(key)と値で構成された新しいデータを追加する。 |
void putAll(Map<? extends K, ? extends V> m) |
Map に別の Map を追加する。 |
V remove(Object key) |
指定したキー(key)に該当するデータ(value)を削除し、削除したデータ(value)を返す。 |
int size() |
Map の要素数を返す。 |
Collection<V> values() |
value の一覧を Collection 形式で返す。 |
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) |
Key 値に該当する Value が存在すれば取得して使用し、なければ新しく作るパターンのコードを、Java 8 ではこのメソッドで短く実装できる。 |
computeIfAbsent メソッド
Absent は不在を意味する単語である。このメソッドは、Map に該当する Key 値が見つからないときに Value を入れるメソッドである。
次の例は、Map で特定のキーに該当する値が存在するか確認した後、なければ新しく入れる形式のコードである。
Map<Key, Value> map = new HashMap();
Value value = map.get(key);
if (value == null) {
value = getNewValue(key);
map.put(key, value);
}
上の例のコードは、次のように computeIfAbsent メソッドを使用すると簡潔に書ける。
Map<Key, Value> map = new HashMap();
Value value = map.computeIfAbsent(key, k -> getNewValue(key));
HashMap クラス
Map 系列の Collection であり、データを保存するためにハッシュテーブルを使用する。HashMap はデータを保存するとき、保存しようとする要素のほかに key 値に該当するオブジェクトを指定し、データを取得するときも保存した key 値によってデータを取得する。したがって HashMap オブジェクトを生成するときも、key 値と value 値を指定するコンストラクタを使用できる。HashMap はソート機能をサポートしない。
HashMap の例
package com.devkuma.tutorial.java.util.collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class HashMapClass1 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
System.out.println("\n-- Example1 -----");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("Key=" + entry.getKey() + ", Value=" + entry.getValue());
}
System.out.println("\n-- Example2 -----");
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
System.out.println("Key : " + entry.getKey() + " Value :" + entry.getValue());
}
System.out.println("\n-- Example3 -----");
// Java8 only, forEach and Lambda
map.forEach((k, v) -> System.out.println("Key=" + k + ", Value=" + v));
System.out.println("\n-- Example4 -----");
for (Integer key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
実行結果は次のとおりである。
-- Example1 -----
Key=1, Value=one
Key=2, Value=two
Key=3, Value=three
-- Example2 -----
Key : 1 Value :one
Key : 2 Value :two
Key : 3 Value :three
-- Example3 -----
Key=1, Value=one
Key=2, Value=two
Key=3, Value=three
-- Example4 -----
key=1, value=one
key=2, value=two
key=3, value=three
LinkedHashMap クラス
LinkedHashMap クラスは HashMap クラスを継承したクラスであり、入力した順序どおりにデータを保存する Collection である。LinkedHashMap はデータを key-value のペアとして保存し、データを取得するときも入力した順序どおりに取得する。HashMap とは異なり、入力した順序での並びを保証する。
LinkedHashMap の例
package com.devkuma.tutorial.java.util.collection;
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapClass {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("11", 104);
map.put("23", 133);
map.put("32", 111);
map.put("24", 123);
map.put("15", 144);
map.put("36", 113);
for (String key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
実行結果は次のとおりである。
key=11, value=104
key=23, value=133
key=32, value=111
key=24, value=123
key=15, value=144
key=36, value=113
TreeMap クラス
TreeMap クラスは Map インターフェースと SortedMap インターフェースを実装したクラスであり、ソート機能がサポートされる Map 形式の Collection である。TreeMap はデータを key-value のペアとして保存し、ソートをサポートし、データを取得する速度も速い。HashMap とは異なり、key 値を昇順で保存する。
TreeMap の例
package com.devkuma.tutorial.java.util.collection;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapClass {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<String, Integer>();
map.put("11", 104);
map.put("23", 133);
map.put("32", 111);
map.put("24", 123);
map.put("15", 144);
map.put("36", 113);
for (String key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
実行結果は次のとおりである。
key=11, value=104
key=15, value=144
key=23, value=133
key=24, value=123
key=32, value=111
key=36, value=113