Java EnumSet:创建、操作与性能优化指南
Java EnumSet
本指南通过实战代码示例与最佳实践,带你掌握 Java EnumSet 的创建、操作与优化。
EnumSet 类是专为枚举类型设计的高性能 Set 实现。它实现 java.util.Set 接口,并继承 Cloneable 和 Serializable,兼具通用性与高效性。
深入前,请确保熟悉 Java 枚举,因 EnumSet 紧密绑定单一枚举类型。

创建 EnumSet
与其他 Set 实现不同,EnumSet 不暴露公共构造器。而是使用静态工厂方法构建集合。
1. 使用 EnumSet.allOf()
allOf() 创建包含指定枚举类型所有常量的集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
}
}
输出
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
2. 使用 EnumSet.noneOf()
创建仅能包含指定枚举类型值的空集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
System.out.println("空 EnumSet: " + sizes);
}
}
输出
空 EnumSet: []
注意:结果集仅接受 Size 常量,因实例化时使用 Size.class。
3. 使用 EnumSet.range()
构建包含从下界到上界(含)所有枚举常量的集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
System.out.println("EnumSet: " + sizes);
}
}
输出
EnumSet: [MEDIUM, LARGE, EXTRALARGE]
4. 使用 EnumSet.of()
创建包含一个或多个特定枚举常量的集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
System.out.println("EnumSet1: " + sizes1);
EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
System.out.println("EnumSet2: " + sizes2);
}
}
输出
EnumSet1: [MEDIUM] EnumSet2: [SMALL, LARGE]
EnumSet 的常用操作
添加元素
add()— 插入单个枚举常量。addAll()— 合并同枚举类型的另一集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> all = EnumSet.allOf(Size.class);
EnumSet<Size> selected = EnumSet.noneOf(Size.class);
selected.add(Size.MEDIUM);
System.out.println("add() 后: " + selected);
selected.addAll(all);
System.out.println("addAll() 后: " + selected);
}
}
输出
add() 后: [MEDIUM] addAll() 后: [SMALL, MEDIUM, LARGE, EXTRALARGE]
注意 addAll() 接受任何 Collection<Size>,包括列表或集合,只要包含相同枚举类型。
遍历元素
用 Iterator 遍历:
import java.util.EnumSet;
import java.util.Iterator;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
Iterator<Size> it = sizes.iterator();
System.out.print("EnumSet: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
输出
EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,
移除元素
remove()— 删除特定常量。removeAll()— 传入自身可清空集合。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
boolean removed = sizes.remove(Size.MEDIUM);
System.out.println("MEDIUM 是否移除? " + removed);
boolean cleared = sizes.removeAll(sizes);
System.out.println("所有元素是否移除? " + cleared);
}
}
输出
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE] MEDIUM 是否移除? true 所有元素是否移除? true
其他辅助方法
| 方法 | 说明 |
|---|---|
copyOf() | 创建包含相同元素的新 EnumSet |
contains() | 检查特定常量是否存在 |
isEmpty() | 无元素返回 true |
size() | 返回元素数量 |
clear() | 移除所有元素 |
Cloneable 与 Serializable
EnumSet 实现 Cloneable,可通过 clone() 创建浅拷贝。也实现 Serializable,支持网络传输或持久化。
为何使用 EnumSet?
因 EnumSet 以位向量存储值,add、remove、contains 等操作以常数时间、极小内存开销执行。JVM 已知给定枚举的所有可能常量,使 EnumSet 远比 HashSet 或 TreeSet 等通用实现高效。
实践中,需要高性能枚举值集合时,首选 EnumSet。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java 枚举:枚举类与枚举常量完全指南
- Java 枚举构造器详解与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比