JavaのMap
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の重要な派生インターフェースとして、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著)の内容をもとにしたものです。