EnumSet是Java中专为枚举设计的高性能集合,采用位向量实现,具有内存紧凑、操作高效的特点。1. 使用EnumSet.allOf()创建包含所有枚举值的集合;2. 通过EnumSet.noneOf()创建空集;3. 利用EnumSet.of()初始化指定元素;4. EnumSet.range()生成连续枚举区间。支持add、remove、retainAll等高效操作,适用于状态管理与权限控制场景。
在Java中,EnumSet 是专为枚举类型设计的高性能集合实现。它提供了一种紧凑且高效的存储方式,适用于操作一组枚举值的场景。相比普通的 HashSet 或 ArrayList,EnumSet 使用位向量(bit vector)来表示元素,因此在内存占用和访问速度上具有显著优势。
EnumSet 不能通过构造函数直接实例化,必须使用其提供的静态工厂方法。根据使用场景选择合适的方法可以提升代码可读性和性能。
常用创建方式包括:例如,定义一个表示工作日的枚举:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
使用 EnumSet 初始化:
EnumSetworkDays = EnumSet.range(Day.MONDAY, Day.FRIDAY); EnumSet weekends = EnumSet.of(Day.SATURDAY, Day.SUNDAY); EnumSet allDays = EnumSet.allOf(Day.class);
EnumSet 支持标准的 Set 接口操作,但由于内部基于位运算,执行效率极高。
常见操作建议:示例:筛选可用服务类型
public enum ServiceType {
EMAIL, SMS, PUSH_NOTIFICATION, CALL
}
// 假设当前支持的服务
EnumSet supported = EnumSet.of(ServiceType.EMAIL, ServiceType.SMS);
// 用户请求启用的功能
EnumSet requested = EnumSet.of(ServiceType.EMAIL, ServiceType.CALL);
// 取交集:实际可启用的服务
requested.retainAll(supported); // 结果只有 EMAIL
EnumSet 的底层采用位向量存储,每个枚举常量对应一个位,因此添加、删除、查找操作的时间复杂度均为 O(1)。同时,它继承了 AbstractSet 的特性,不支持 null 元素,并且元素自然有序(按枚举声明顺序)。
使用注意事项:
若需线程安全,可使用 Collections.synchronizedSet(EnumSet. 包装。
基本上就这些。合理使用 EnumSet 能让枚举集合操作更简洁高效,尤其适合状态机、权限控制、配置标记等场景。掌握其创建方式和操作技巧,有助于写出更清晰、性能更高的 Java 代码。