JavaのEnumMapとHashMapの違いを徹底比較!特徴・性能・使い分けのポイント
はじめに
Javaには複数のMap実装クラスが用意されていますが、その中でもEnumMapとHashMapはよく比較される代表的な存在です。本記事では、両者の特徴や内部実装の違い、パフォーマンスの差などを表とサンプルコードを使ってわかりやすく解説します。
EnumMapとは
EnumMapはJDK5で導入された、enum型をキーとして使用するために特化したMapインターフェースの実装です。主な特徴は以下の通りです。
- すべてのキーは同一のenum型である必要があります
- nullキーは許可されておらず、nullを渡すとNullPointerExceptionがスローされます
公式のJavaドキュメントには次のように記載されています。
EnumMapは内部的に配列を使用しており、この表現は非常にコンパクトかつ効率的です。
HashMapとは
HashMapも同様にMapインターフェースの実装クラスで、データをキーと値のペア形式で格納します。主な特徴は以下の通りです。
- 1つのnullキーと、複数のnull値を許容します
- キーにはプリミティブ型を使用できません(ラッパークラスやオブジェクト型が必要です)
- ハッシュ関数が要素をバケットに適切に分散させる場合、getやputといった基本操作に対して定数時間(O(1))のパフォーマンスを提供します
EnumMapとHashMapの比較一覧
| No. | 項目 | EnumMap | HashMap |
|---|---|---|---|
| 1 | 基本 | enum型のキー専用に設計された特殊なMap実装 | 汎用的なMapインターフェースの実装 |
| 2 | nullキー | 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が適しています。用途に応じて適切に使い分けましょう。
-
JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説
はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って