应优先使用 EnumMap 替代 HashMap 存储枚举键,因其基于数组实现、免哈希计算、操作稳定 O(1)、内存更省且遍历顺序严格按枚举声明顺序。

直接用 EnumMap 替代 HashMap 存枚举键,性能更好、内存更省、顺序更稳。
为什么选 EnumMap 而不是 HashMap
EnumMap 内部用数组存储,索引由枚举的 ordinal() 直接决定——比如 DayOfWeek.MONDAY.ordinal() == 0,就存到数组第 0 位。这省掉了哈希计算、扩容判断和链表/红黑树处理,所有操作稳定 O(1)。同时它不存冗余结构,比 HashMap 占用内存小得多。
但要注意:底层数组长度等于枚举常量总数。哪怕只 put 2 个值,有 100 个枚举常量,数组就是 100 长。所以适合常量数量可控(几十到一两百)、极少变动的枚举,比如 HttpStatusCode、GameState、DayOfWeek。
正确创建和初始化方式
必须在构造时传入枚举类,不能靠泛型推断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
✅ 推荐写法:
EnumMap<DayOfWeek, String> map = new EnumMap<>(DayOfWeek.class); -
✅ Java 9+ 小规模快速构建:
EnumMap.of(DayOfWeek.MONDAY, "开工", DayOfWeek.FRIDAY, "收工") -
❌ 编译失败:
new EnumMap<>()—— 类型擦除后无法获取枚举类信息
日常操作与注意事项
put/get 行为和 HashMap 类似,但有几点关键差异:
- key 绝对不能为
null,否则抛NullPointerException - value 可以为
null,但get(key)返回null时,无法区分“没这个 key”还是“这个 key 的 value 显式设为 null” - 遍历结果严格按枚举声明顺序(如
MONDAY → TUESDAY → ... → SUNDAY),无需额外排序 - 非线程安全,多线程写入需手动同步,例如:
Collections.synchronizedMap(new EnumMap<>(Type.class))
典型适用场景
适合那些键固定、语义明确、需要高频读写的映射关系:
- 状态机动作映射(如
GameState.PLAYING → "运行游戏逻辑") - 配置项开关(如
FeatureFlag.LOGIN_V2 → true) - 策略对象注册(如
PaymentMethod.ALIPAY → AliPayStrategy) - HTTP 状态码描述(如
HttpStatus.OK → "OK")
不建议用于可能动态扩展的枚举(如插件系统新增枚举值),也不适合常量超千个且稀疏使用的场景。

















