JavaのMapについて

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()));
    }
}
    

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です