EnumSet 是 Java 中专门为枚举类型设计的高效 Set 实现,在 JDK 1.5 引入,位于 java.util 包下。它的使用场景非常明确,核心思想是:当你操作的集合元素全部来自同一个 enum 时,优先使用 EnumSet。
下面从 使用场景、示例、优势、对比 四个方面说明。
这是 最常见、最推荐 的使用场景。
例如:
enum Permission {
READ, WRITE, EXECUTE
}
EnumSet<Permission> perms = EnumSet.of(
Permission.READ, Permission.WRITE
);
表示:当前用户拥有 读 + 写 权限。
在 EnumSet 出现之前,常用 int 位运算表示状态:
static final int FLAG_READ = 1 << 0;
static final int FLAG_WRITE = 1 << 1;
这种方式:
✅ EnumSet 是位掩码的现代替代方案
EnumSet<Permission> perms = EnumSet.of(READ, WRITE);
// 所有权限
EnumSet<Permission> all = EnumSet.allOf(Permission.class);
// 没有任何权限
EnumSet<Permission> none = EnumSet.noneOf(Permission.class);
// 指定范围
EnumSet<Weekday> weekdays =
EnumSet.range(Weekday.MON, Weekday.FRI);
非常适合做 初始化、批量操作。
void process(EnumSet<Feature> features) {
if (features.contains(Feature.LOGGING)) {
// 开启日志
}
}
比 boolean 参数更清晰、可扩展。
EnumSet<State> states = EnumSet.of(State.INIT, State.RUNNING);
if (states.contains(State.RUNNING)) {
// do something
}
| 特性 | 说明 |
|---|---|
| 时间复杂度 | 增删查接近 O(1) |
| 内存占用 | 极低 |
| 迭代顺序 | 按 enum 定义顺序 |
| 线程安全 | ❌ 非线程安全 |
❌ 只能存放同一个 enum 类型
EnumSet<Color> set; // OK
EnumSet<Object> set; // 编译错误
❌ 不能存 null
set.add(null); // NullPointerException
❌ 不能手动 new
new EnumSet<>(); // ❌ 编译错误
✅ 必须通过工厂方法创建:
EnumSet.of(...)
EnumSet.allOf(...)
EnumSet.noneOf(...)
EnumSet.range(...)
| 对比项 | EnumSet | HashSet | TreeSet |
|---|---|---|---|
| 元素类型 | enum | 任意 | 任意 |
| 顺序 | enum 定义顺序 | 无序 | 排序 |
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 内存 | 极小 | 较大 | 较大 |
| 位运算替代 | ✅ | ❌ | ❌ |
✅ 只要是 enum,优先 EnumSet,而不是 HashSet
EnumSet 适用于:当集合元素全部来自同一个 enum 时,用来表示状态、权限、组合、开关等场景,既有类型安全,又有极致性能。
如果你愿意,我可以帮你结合你当前的业务代码,判断 是否适合用 EnumSet 来重构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。