enummap和enumset比hashmap/hashset更快、更省内存且自带顺序;enummap以枚举ordinal为下标实现o(1)操作,enumset用位图存储,64个以内仅占8字节,二者组合适用于状态机、权限校验等场景。

直接用 EnumMap 和 EnumSet 处理枚举数据,比 HashMap 和 HashSet 快得多、省内存、还自带顺序——关键是你几乎不用改逻辑,换掉集合声明就能见效。
EnumMap:用枚举当键的“数组级”映射
它内部不走哈希计算,而是把枚举的 ordinal() 当作数组下标,get/put 都是 O(1),且天然按枚举定义顺序排列。
- 声明时必须指定枚举类,比如
new EnumMap<orderstatus integer>(OrderStatus.class)</orderstatus>,不能用通配符或 Object - 不允许 null 键(枚举实例本身不可能为 null),但 value 可以为 null
-
keySet()返回的是 EnumSet,values()是有序的 Collection,遍历时无需额外排序 - 适合场景:统计枚举分布(如各订单状态数量)、状态对应配置(如每种错误码的提示文案)
EnumSet:位图驱动的轻量集合
底层用一个或多个 long 值做位向量,每个 bit 代表一个枚举常量是否存在。64 个以内只占 8 字节,空间效率极高。
- 所有元素必须来自同一枚举类型,创建后无法添加其他类型值
- 常用工厂方法:
noneOf(Class)(空集)、of(e1, e2)(指定元素)、range(from, to)(含两端的连续段) - 支持高效集合运算:
union()、intersection()、complementOf(),全是位运算,比循环 add 快一个数量级 - 适合场景:权限组合(如用户启用的功能集)、状态白名单(如某角色允许执行的操作)
组合使用:状态机与权限校验的简洁写法
单靠一个集合难覆盖复杂关系,但 EnumMap + EnumSet 搭配能自然建模“维度+属性绑定”结构。
- 用 EnumMap 存每个状态对应的合法转移目标:
EnumMap<state enumset>></state> - 查询时直接
transitions.get(currentState).contains(nextState),O(1) 完成流转校验 - 配合权限检查:
userPermissions.containsAll(requiredActions),一行判断是否满足全部前提 - 彻底避开冗长的 if-else 或反射查找,代码可读性与执行效率同步提升
注意事项与避坑点
它们不是万能替代品,用错场景反而增加理解成本。
- 线程不安全:多线程写入需外部同步,或用
Collections.synchronizedMap()包装(但会损失部分性能优势) - 类型锁定:创建后无法混入其他枚举类,也不支持运行时动态扩展枚举项(新增枚举常量不影响已有 EnumSet/Map)
- 不适用于泛型需求:如果集合需要容纳多种类型,或者键/元素不确定是否为枚举,就别硬套
- 调试友好性:IDE 能直接展开查看内容,日志输出也清晰可读,比 HashMap 的哈希码更直观










