EnumSet 是 Java 专为枚举类型优化的高性能集合,底层用位向量实现,每个枚举常量对应唯一比特位,操作均为 O(1) 位运算,内存极省、速度快、元素按声明顺序有序,必须通过静态工厂方法(如 allOf、noneOf、of、range)创建,不支持 null 和多线程并发写入。

创建 EnumSet 的常用方式
EnumSet 是抽象类,不能直接 new,必须通过静态工厂方法创建:
- EnumSet.allOf(YourEnum.class):包含该枚举所有常量,最常用
- EnumSet.noneOf(YourEnum.class):空集合,可后续 add
- EnumSet.of(E1, E2, ...):指定一个或多个枚举常量(支持可变参数)
- EnumSet.range(E1, E2):包含从 E1 到 E2(含两端)之间按声明顺序连续的枚举值(要求 E1 ≤ E2)
- EnumSet.complementOf(existingSet):返回原集合的补集(即全集减去 existingSet)
典型使用场景示例
比如定义权限枚举:
enum Permission { READ, WRITE, DELETE, EXECUTE }
常用操作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用户拥有部分权限:
EnumSet.of(Permission.READ, Permission.WRITE) - 管理员拥有全部权限:
EnumSet.allOf(Permission.class) - 只读用户权限范围:
EnumSet.range(Permission.READ, Permission.READ)(等价于 of(READ)) - 添加/删除:
set.add(Permission.EXECUTE); set.remove(Permission.DELETE); - 集合运算:
EnumSet.copyOf(set1).retainAll(set2)(交集),set1.addAll(set2)(并集)
注意事项和限制
EnumSet 只能存放同一枚举类型的值,且不支持 null:
立即学习“Java免费学习笔记(深入)”;
- 编译期就限定泛型,如
EnumSet<Permission>,类型安全 - 向其中 add null 会抛出
NullPointerException - 不能存放不同枚举类的实例,即使名字相同也不行
- 线程不安全,多线程修改需外部同步(如用 Collections.synchronizedSet 包装)
- 迭代器返回顺序严格按枚举常量声明顺序,不是插入顺序
为什么比 HashSet 更适合枚举?
核心优势在底层实现:
- 每个枚举常量对应一个 bit 位,集合用 long 或 long[] 数组表示,空间极省
- add/remove/contains 都是位运算,O(1) 时间复杂度,比哈希表更快更稳定
- 没有哈希冲突、扩容、对象包装开销,GC 压力小
- 自动保持自然顺序,无需额外排序

















