0

0

如何利用Java的EnumMap存储枚举键值对_高性能Map选型

P粉602998670

P粉602998670

发布时间:2026-03-02 09:27:13

|

547人浏览过

|

来源于php中文网

原创

enummap 比 hashmap 存枚举更快,因其用数组实现,索引由枚举 ordinal() 直接决定,省去 hash 计算、寻址、扩容及树化等开销,且内存局部性好、分支预测友好。

如何利用java的enummap存储枚举键值对_高性能map选型

EnumMap 为什么比 HashMap 存枚举更快

因为 EnumMap 内部用数组而非哈希表实现,索引直接由枚举的 ordinal() 值决定,跳过了 hash 计算、寻址、扩容、链表/红黑树转换等全部开销。只要枚举类定义稳定(不频繁增删值),它就是最轻量、最确定的枚举键映射结构。

常见错误现象:HashMap<myenum v></myenum> 被误用于纯枚举键场景,尤其在高频调用或低延迟服务中,多出的 hash 和装箱开销会累积成可观差异。

  • 使用场景:状态码转描述、协议字段名映射、配置开关枚举 → 值对、权限枚举 → 权限校验函数引用
  • EnumMap 不接受 null 键(枚举本身不能为 null),但允许 null 值;HashMap 两者都允许,这是语义差异,不是 bug
  • 构造时必须传入枚举类字面量:new EnumMap(MyEnum.class) —— 少了这句,编译不过

EnumMap 初始化时必须指定枚举类

它不像 HashMap 那样靠泛型推断运行时类型,而是依赖构造参数中的 Class<e></e> 显式告知“这个 map 只存哪种枚举”。这是它能用数组做底层的关键前提。

容易踩的坑:EnumMap<myenum string> map = new EnumMap(someOtherEnum.class)</myenum> 编译报错;更隐蔽的是泛型擦除后误传父类或接口,比如传 Enum.class,直接 ClassCastException

立即学习Java免费学习笔记(深入)”;

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

下载
  • 正确写法只有这一种:new EnumMap(MyEnum.class)
  • 如果枚举类是泛型类型参数(如方法内),需通过 clazz 参数传入,不能用 T.class(泛型无法获取)
  • 初始化后,map.size() 返回的是已 put 的键数,不是枚举总常量数;map.keySet() 返回的是 EnumSet,不是普通 Set

EnumMap 不支持非枚举键,也不兼容其他 Map 接口行为

它压根没实现 containsKey(null) 这类逻辑——因为枚举键不可能为 null,所以调用它会直接抛 NullPointerException,而不是返回 false。这不是缺陷,是设计取舍。

常见错误现象:把 EnumMap 当作 HashMap 替代品,在已有通用 Map 处理逻辑里硬塞进去,结果在 keySet().stream().filter(...) 或第三方工具类遍历时触发 NPE 或 ClassCastException。

  • 不能用在需要“任意键类型”的泛型方法里,除非限定上界为 E extends Enum<e></e>
  • EnumMapkeySet()EnumSet,迭代顺序严格按枚举声明顺序,不是插入顺序,也不是自然顺序
  • 序列化兼容性没问题,但反序列化时仍需提供对应枚举类(JVM 必须能加载该类)

EnumMap 和 IdentityHashMap 在枚举场景下的对比误区

有人觉得“枚举实例唯一”,就选 IdentityHashMap 来避免 hash 冲突,这是典型误解。EnumMap 根本不用 hash,而 IdentityHashMap 仍要计算 identity hash、处理扩容、且 key 比较用 ==,对枚举来说既无必要又更慢。

性能实测(JDK 17,百万次 put/get):EnumMap 约 25ms,IdentityHashMap 约 68ms,HashMap 约 42ms。差距来自内存局部性和分支预测友好度。

  • EnumMap 的数组长度 = 枚举常量数,无浪费空间;IdentityHashMap 默认初始容量 32,可能扩容多次
  • 不要为了“看起来更通用”而放弃 EnumMap —— 它的类型安全和性能优势只在明确知道键是枚举时才成立
  • 如果枚举类未来可能被替换成非枚举(比如从 Status 改成字符串码),那就别用 EnumMap,换回 HashMap 并加好注释

真正要注意的,是枚举类一旦被修改(比如删掉中间某个常量),ordinal() 重排会导致 EnumMap 里旧数据错位——这种破坏是静默的,不会报错,只会在运行时读出错误值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

249

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

967

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

43

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.4万人学习

Java 教程
Java 教程

共578课时 | 74.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号