EnumSet.of() 高效因底层用位向量实现:1个元素用SingletonSet,2–64个用单long位存储的RegularEnumSet,超64个用long[]的JumboEnumSet,避免哈希、装箱、扩容开销。

EnumSet.of() 是 Java 中创建轻量、高效枚举集合最直接的方式,它底层基于位向量(bit vector)实现,时间与空间开销极小,且线程不安全但适合单线程高频场景。
为什么 EnumSet.of() 高效?
EnumSet 是抽象类,of() 方法会根据传入元素个数自动选择最优子类:
- 1 个元素 → 返回
EnumSet$SingletonSet(内部仅存一个字段) - 2–64 个元素(且属于同一枚举类)→ 返回
EnumSet$RegularEnumSet,用一个long值按位存储(每个 bit 对应枚举项的ordinal()) - 超过 64 个 → 返回
EnumSet$JumboEnumSet,用long[]数组扩展位宽
所有实现都避免了哈希计算、对象包装、扩容等开销,比 HashSet 或 ArrayList 快得多。
基本用法:指定一个或多个枚举常量
语法简洁,类型安全,编译期检查枚举类一致性:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
enum Color { RED, GREEN, BLUE, YELLOW }
// 单个元素
EnumSet<Color> one = EnumSet.of(Color.RED);
// 多个元素(顺序无关,自动去重)
EnumSet<Color> many = EnumSet.of(Color.RED, Color.BLUE, Color.GREEN);
// 支持连续范围 + 离散项混合(需配合 range())
EnumSet<Color> mixed = EnumSet.copyOf(EnumSet.range(Color.RED, Color.GREEN));
mixed.addAll(EnumSet.of(Color.YELLOW));
关键注意事项
使用时需留意以下限制和最佳实践:
- 所有参数必须属于同一个枚举类型,否则编译报错
- 不能传入
null,否则抛出NullPointerException - 返回集合是可变的,可后续调用
add()、remove(),但修改后可能触发内部结构升级(如从RegularEnumSet变为JumboEnumSet) - 若需不可变视图,用
Collections.unmodifiableSet()包装,但注意这会失去位向量优势(变为通用 Set 包装)
替代方案对比:什么情况下不该用 of()?
虽然 of() 最常用,但某些场景有更优选择:
- 需要空集合 → 用
EnumSet.noneOf(Color.class)(比of()少一次判空逻辑) - 需要全量集合 → 用
EnumSet.allOf(Color.class)(内部直接置满位,O(1)) - 元素来自集合/数组 → 用
EnumSet.copyOf(collection),比循环调用of()更高效 - 需跨方法复用固定组合 → 定义
public static final枚举集,避免重复构造

















