Java - Map インターフェースと関連クラス

Map インターフェース

Map インターフェースは、データを保存するために別のオブジェクトをキー値として指定し、key-value を 1 つのペアとして保存して管理する Collection である。キーオブジェクトの重複は許可しないが、データの重複は許可する。インデックスを管理しないため、ソートなどの処理には適していない。Map インターフェースを実装した下位クラスには HashMap、LinkedHashMap、TreeMap がある。

  • Map
    • HashMap
      • LinkedHashMap
    • SortedMap
      • TreeMap

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