Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのEnumMapとHashMapの違いを徹底比較!特徴・性能・使い分けのポイント

はじめに

Javaには複数のMap実装クラスが用意されていますが、その中でもEnumMapHashMapはよく比較される代表的な存在です。本記事では、両者の特徴や内部実装の違い、パフォーマンスの差などを表とサンプルコードを使ってわかりやすく解説します。

EnumMapとは

EnumMapはJDK5で導入された、enum型をキーとして使用するために特化したMapインターフェースの実装です。主な特徴は以下の通りです。

  • すべてのキーは同一のenum型である必要があります
  • nullキーは許可されておらず、nullを渡すとNullPointerExceptionがスローされます

公式のJavaドキュメントには次のように記載されています。

EnumMapは内部的に配列を使用しており、この表現は非常にコンパクトかつ効率的です。

HashMapとは

HashMapも同様にMapインターフェースの実装クラスで、データをキーと値のペア形式で格納します。主な特徴は以下の通りです。

  • 1つのnullキーと、複数のnull値を許容します
  • キーにはプリミティブ型を使用できません(ラッパークラスやオブジェクト型が必要です)
  • ハッシュ関数が要素をバケットに適切に分散させる場合、getやputといった基本操作に対して定数時間(O(1))のパフォーマンスを提供します

EnumMapとHashMapの比較一覧

No.項目EnumMapHashMap
1基本enum型のキー専用に設計された特殊なMap実装汎用的なMapインターフェースの実装
2nullキーnullキーは不可1つのnullキーと複数のnull値が可能
3パフォーマンスすべての操作が定数時間で実行され、HashMapより高速EnumMapより低速
4内部実装配列(Array)を使用ハッシュテーブル(Hashtable)を使用
5順序キーの自然順序(natural order)で格納される順序は保証されない

EnumMapのサンプルコード

import java.util.EnumMap;
import java.util.Map;

public class EnumMapExample {

    public enum LaptopEnum {
        HCL, DELL, IBM
    };

    public static void main(String[] args) {
        // EnumMapを作成
        EnumMap<LaptopEnum, String> map = new EnumMap<>(LaptopEnum.class);
        map.put(LaptopEnum.HCL, "100");
        map.put(LaptopEnum.DELL, "200");
        map.put(LaptopEnum.IBM, "300");

        // マップの内容を出力
        for (Map.Entry<LaptopEnum, String> m : map.entrySet()) {
            System.out.println(m.getKey() + " " + m.getValue());
        }
    }
}

このコードを実行すると、enumの宣言順(HCL → DELL → IBM)でエントリが出力されます。これはEnumMapがキーの自然順序を保持するためです。

HashMapのサンプルコード

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {

    public static void main(String[] args) {
        // HashMapを作成
        Map<String, String> map = new HashMap<>();
        map.put("HCL", "100");
        map.put("DELL", "200");
        map.put("IBM", "300");

        // マップの内容を出力
        for (Map.Entry<String, String> m : map.entrySet()) {
            System.out.println(m.getKey() + " " + m.getValue());
        }
    }
}

HashMapの場合、出力順序は保証されないため、実行するたびに順序が変わる可能性がある点に注意してください。

まとめ:どちらを使うべきか?

キーがenum型に限定できる場合は、EnumMapを選ぶのがベストプラクティスです。内部的に配列を使用しているためメモリ効率が良く、高速かつ順序も保証されます。一方、任意のオブジェクトをキーにしたい場合や、柔軟性が求められる場合はHashMapが適しています。用途に応じて適切に使い分けましょう。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って