JavaのMapについて
JavaのMap
は、キーと値のペアを管理するコレクションであり、キーを使って値に効率的にアクセスするためのデータ構造です。キーは一意であり、重複することはできません。一方、値には重複が許されます。以下では、JavaのMap
について詳しく解説します。
Mapとは何か
JavaのMap
は、java.util
パッケージに属するインターフェースです。キーと値のペアを格納し、それらの関連性を効率的に管理します。
例えば、電話帳を考えてみてください。名前をキー、電話番号を値として格納すれば、名前を使って対応する電話番号をすばやく取得できます。
Map
の特徴:
- キーは一意でなければならない。
- 値は重複しても良い。
- 任意のデータ型をキーと値に使用できる。
Mapの主な実装
Javaでは、Map
インターフェースを実装した複数のクラスがあります。それぞれ特徴が異なり、用途に応じて選択します。
HashMap
HashMap
は、キーと値をハッシュテーブルに格納する実装です。
- 順序は保証されない。
- 高速な検索と挿入が可能。
null
キーとnull
値を許可する。
LinkedHashMap
LinkedHashMap
は、挿入順序を維持するHashMap
のサブクラスです。
- 要素の順序を保証する。
- メモリ使用量が
HashMap
より多い。
TreeMap
TreeMap
は、キーを自然順序またはカスタムのコンパレータに従ってソートする実装です。
- 順序付きのデータを扱う場合に便利。
- 挿入や削除に時間がかかる。
ConcurrentHashMap
ConcurrentHashMap
は、スレッドセーフなHashMap
です。
- 複数のスレッドから安全にアクセス可能。
- ロックを分割して効率を向上。
基本操作
以下に、Map
で利用可能な主な操作を示します。
put(K key, V value)
: キーと値を追加または更新する。get(Object key)
: キーに対応する値を取得する。remove(Object key)
: キーに対応するキーと値のペアを削除する。containsKey(Object key)
: キーが存在するかを確認する。containsValue(Object value)
: 値が存在するかを確認する。keySet()
: すべてのキーをセットで取得する。values()
: すべての値をコレクションで取得する。
使用例
HashMapの基本例
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 要素を追加
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
// 要素を取得
System.out.println("Alice's age: " + map.get("Alice"));
// キーが存在するか確認
if (map.containsKey("Bob")) {
System.out.println("Bob is in the map.");
}
// 要素を削除
map.remove("Charlie");
// 全要素を表示
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
}
TreeMapを使ったソート例
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<>();
// 要素を追加
map.put(3, "C");
map.put(1, "A");
map.put(2, "B");
// ソートされた順序で表示
for (int key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
}
ConcurrentHashMapを使ったスレッドセーフな例
import java.util.concurrent.ConcurrentHashMap;
public class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
// 要素を追加
map.put("Key1", "Value1");
map.put("Key2", "Value2");
// スレッドセーフに値を更新
map.putIfAbsent("Key3", "Value3");
System.out.println(map);
}
}
応用トピック
カスタムクラスをキーとして使用
カスタムクラスをキーとして使用する場合、equals()
とhashCode()
を適切に実装する必要があります。
ストリームを使った操作
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
// ストリームを使ったフィルタリング
map.entrySet().stream()
.filter(entry -> entry.getValue() > 25)
.forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
}
}