EnumMap 用枚举 ordinal() 作数组下标实现O(1)访问,需显式传入枚举类构造,底层为固定长度Object[],键必须为指定枚举实例,迭代有序且视图只读。

必须显式传入枚举类构造
EnumMap 无法靠泛型推断键类型,初始化时必须传入具体的枚举类字面量:
- ✅ 正确:
new EnumMap<Status, String>(Status.class) - ❌ 错误:
new EnumMap<>()(编译失败)或传错类型(如String.class) - Java 9+ 可用静态工厂简化少量数据:
EnumMap.of(Status.PENDING, "处理中", Status.DONE, "已完成")
底层是数组,不是哈希表
它内部维护一个固定长度的 Object[],长度等于该枚举的常量总数(Status.values().length):
-
put(Status.PENDING, "abc")→ 写入数组索引0(因为PENDING.ordinal() == 0) -
get(Status.DONE)→ 直接读取索引2(假设DONE.ordinal() == 2) - 跳过哈希计算、桶查找、链表遍历、扩容判断和装箱开销
键有严格限制,null 和非法类型会立即报错
Key 必须是构造时指定的那个枚举的有效实例:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
map.put(null, "x")→ 立即抛NullPointerException -
map.put(OtherEnum.VALUE, "x")→ 抛ClassCastException - value 可为
null,但get(key) == null无法区分“键不存在”还是“值为 null”,应改用containsKey(key)判断
天然有序且视图只读
迭代顺序严格按枚举声明顺序(即 values() 返回顺序):
立即学习“Java免费学习笔记(深入)”;
- 适合生成下拉列表、状态流转说明等需要稳定顺序的场景
-
keySet()、entrySet()、values()返回的是只读视图 -
keySet().add(...)或values().clear()→ 抛UnsupportedOperationException -
keySet().remove(key)是合法的,等价于map.remove(key)


















