EnumMap 比 HashMap 更快,因其用数组代替哈希表,索引由枚举 ordinal 值直接决定,免去哈希计算、key 比较及冲突处理,空间紧凑且遍历顺序固定。

EnumMap 是 Java 中专为枚举类型设计的高效映射实现,它用数组代替哈希表,避免了哈希计算和冲突处理,因此在键为枚举时性能明显优于 HashMap。
为什么 EnumMap 比 HashMap 更快?
EnumMap 内部使用数组存储值,索引直接由枚举的 ordinal() 值决定。例如:
- 枚举常量声明顺序即其
ordinal(从 0 开始); - put("RED") → 实际存入数组索引 0 的位置;
- get() 不需要计算 hash、不比较 key、不处理链表或红黑树;
- 空间紧凑,无空桶,无装填因子限制。
如何正确创建和使用 EnumMap
必须显式指定枚举类类型,不能靠类型推断:
- ✅ 正确:
EnumMapmap = new EnumMap(Color.class); - ❌ 错误:
new EnumMap()编译不通过(类型擦除后无法获取枚举类); - 支持所有 Map 接口方法,但 key 只能是该枚举的实例或 null(null 会被拒绝,抛
NullPointerException); - 遍历时顺序固定:按枚举常量声明顺序,天然有序,无需额外排序。
适用场景与注意事项
适合键集明确、不变且数量有限的配置映射场景:
立即学习“Java免费学习笔记(深入)”;
- HTTP 状态码 → 描述文本;
- 设备类型 → 默认超时时间;
- 权限级别 → 可执行操作列表;
- ⚠️ 不支持泛型枚举(如
E extends Enum的通配场景); - ⚠️ 不能用于非枚举类型,也不接受子类枚举(必须严格匹配构造时传入的 Class)。
基本上就这些。用对了枚举键,EnumMap 就是轻量、快速、安全的首选。











