JavaのMapは、キーと値を対応付けるデータ構造です。キーと値のペアを効率的に格納、取得、更新、削除できます。要素だけを格納するコレクションとは異なり、Mapではキーと値の対応関係が保持されます。各キーは一意であり、1つの値を指しますが、同じ値を複数のキーに対応付けることはできます。

Mapインターフェースは、一意の(重複しない)キーから値を取得するための仕組みを提供します。また、Mapの内容を異なる方法で扱うための3つのコレクションビューを提供します。キーの集合、値のコレクション、またはキーと値の対応付けの集合として扱うことができます。Mapから派生する主要なインターフェースは、ソートされたMapを表すSortedMapと、そのサブインターフェースであるNavigableMapです。Mapは標準ライブラリの多くのクラスで利用されています。非並行MapでMapインターフェースを実装する主要なクラスはHashMap、LinkedHashMap、TreeMapです。並行Mapでは、主要なクラスはConcurrentHashMapとConcurrentSkipListMapです。

以下は、主要なメソッドだけを含むMapインターフェースの定義の一部です。

public interface Map<K,V>{
    // Query Operations
    int size();
    boolean isEmpty();
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    V get(Object key);

    // Modification Operations
    V put(K key, V value);
    V remove(Object key);
    void putAll(Map<? extends K, ? extends V> m);
    void clear();

    // Views
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();

    // Definition of the Entry interface
    interface Entry<K, V> {
        // Body omitted
    }

    // (continues...)
}

次の例は、キーをナンバープレート、値を対応する車種名とするMapを示しています。このMapを使うと、例えばキーをcontainsKeyメソッドの引数として指定することで、ある要素が存在するかどうかを確認できます。また、getメソッドは引数として渡されたキーに対応する値を取得し、removeメソッドはMapからエントリを削除します。

void main() {
    Map<String, String> cars = new HashMap<>();
    cars.put("ABCD2935", "Tesla Model S");
    cars.put("YJKF9353", "Toyota Corolla");
    cars.put("WFLO1304", "Honda CRV");

    var key = "ABCD2935";

    if (cars.containsKey(key)){
        IO.println("Vehicle data:");
        IO.println(cars.get(key));
        IO.println("Removing the vehicle...");
        cars.remove(key);
    } else
        IO.println("Vehicle not found!");
}
Vehicle data:
Tesla Model S
Removing the vehicle...

上記のメソッドに加えて、追加の機能を提供する複数のdefaultメソッドもあります。

このインターフェースには、指定した値から不変Mapを作成するメソッド(of、ofEntries、および補助メソッドentry)や、既存のMapから作成するメソッド(copyOf)も用意されています。

図1は、Mapインターフェースと主要なサブインターフェースを示しています。Mapの直接のサブインターフェースはSequencedMap、Bindings、ConcurrentMapです。間接的には、SortedMap、NavigableMap、ConcurrentNavigableMapもMapから派生したインターフェースです(後者はConcurrentMapのサブインターフェースでもあります)。

Mapインターフェースとそのサブインターフェース

Mapの重要な派生インターフェースとして、SortedMapとNavigableMapがあります。

SortedMapインターフェースはSequencedMapインターフェースを拡張したもので、キーを特定の順序で保持するMapを表します。順序はキーの自然順序、またはMapの作成時に指定した特定のComparatorによって決まります。Collections Frameworkにおける唯一の直接のサブインターフェースであるNavigableMapは、Mapのキーを操作するための、より高度なナビゲーション操作を提供するメソッドを追加します。例えば、特定の値に最も近いキーを取得したり、Mapを昇順または降順で走査したりできます。

実際には、SortedMapよりもNavigableMapを使用することが一般的です。Collections FrameworkでSortedMapを実装する2つのクラスは、いずれも間接的に実装しているためです(TreeMapはNavigableMapを実装し、ConcurrentSkipListMapはConcurrentNavigableMapを実装します)。NavigableMapはより多くの機能を提供し、Mapをナビゲートするための専用メソッドを備えています。これは、集合に対してNavigableSetが提供する機能と類似しています。


この記事は、Orientação a Objetos com Java(Eduardo Kessler Piveta著)の内容をもとにしたものです。