Java 集合框架的 `EnumSet` 类提供了一个对单一枚举类型元素的集合实现。
在学习 EnumSet 之前,请确保您了解 Java 枚举。
它实现了Set接口。
创建 EnumSet
要创建枚举集,我们必须先导入 `java.util.EnumSet` 包。
与其他集合实现不同,枚举集没有公共的 构造函数。我们必须使用预定义的方法来创建枚举集。
1. 使用 allOf(Size)
`allof()` 方法创建一个包含指定枚举类型 Size 的所有值的枚举集。例如,
import java.util.EnumSet;
class Main {
// an enum named Size
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
}
}
输出
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
请注意以下语句:
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
在这里,Size.class 表示我们创建的 Size 枚举。
2. 使用 noneOf(Size)
`noneOf()` 方法创建一个空的枚举集。例如,
import java.util.EnumSet;
class Main {
// an enum type Size
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumSet using noneOf()
EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
System.out.println("Empty EnumSet: " + sizes);
}
}
输出
Empty EnumSet : []
在这里,我们创建了一个名为 sizes 的空枚举。
注意:在上面的程序中,我们只能插入 Size 枚举类型的元素。这是因为我们使用 Size 枚举创建了空枚举集。
3. 使用 range(e1, e2) 方法
`range()` 方法创建一个枚举集,其中包含枚举类型 e1 和 e2 之间的所有值,包括这两个值。例如,
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumSet using range()
EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
System.out.println("EnumSet: " + sizes);
}
}
输出
EnumSet: [MEDIUM, LARGE, EXTRALARGE]
4. 使用 of() 方法
`of()` 方法创建一个包含指定元素的枚举集。例如,
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Using of() with a single parameter
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 的方法
`EnumSet` 类提供的方法允许我们对枚举集执行各种操作。
向 EnumSet 插入元素
- `add()` - 将指定的枚举值插入枚举集中
- `addAll()` 将指定集合的所有元素插入到集中
例如,
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
// Creating an EnumSet using noneOf()
EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);
// Using add method
sizes2.add(Size.MEDIUM);
System.out.println("EnumSet Using add(): " + sizes2);
// Using addAll() method
sizes2.addAll(sizes1);
System.out.println("EnumSet Using addAll(): " + sizes2);
}
}
输出
EnumSet using add(): [MEDIUM] EnumSet using addAll(): [SMALL, MEDIUM, LARGE, EXTRALARGE]
在上面的示例中,我们使用 `addAll()` 方法将枚举集 sizes1 的所有元素插入到枚举集 sizes2 中。
使用 `addAll()` 方法也可以将其他集合(如 `ArrayList`、`LinkedList` 等)的元素插入枚举集中。但是,所有集合都应属于同一枚举类型。
访问 EnumSet 元素
要访问枚举集的元素,我们可以使用 `iterator()` 方法。为了使用此方法,我们必须导入 `java.util.Iterator` 包。例如,
import java.util.EnumSet;
import java.util.Iterator;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
Iterator<Size> iterate = sizes.iterator();
System.out.print("EnumSet: ");
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
输出
EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,
注意:
- `hasNext()` 如果枚举集中存在下一个元素,则返回 `true`
- `next()` 返回枚举集中的下一个元素
删除 EnumSet 元素
- `remove()` - 从枚举集中删除指定元素
- `removeAll()` - 从枚举集中删除所有元素
例如,
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
// Using remove()
boolean value1 = sizes.remove(Size.MEDIUM);
System.out.println("Is MEDIUM removed? " + value1);
// Using removeAll()
boolean value2 = sizes.removeAll(sizes);
System.out.println("Are all elements removed? " + value2);
}
}
输出
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE] Is MEDIUM removed? true Are all elements removed? true
其他方法
方法 | 描述 |
---|---|
copyOf() |
创建 `EnumSet` 的副本 |
contains() |
在 `EnumSet` 中搜索指定元素并返回布尔结果 |
isEmpty() |
检查 `EnumSet` 是否为空 |
size() |
返回 `EnumSet` 的大小 |
clear() |
从 `EnumSet` 中删除所有元素 |
Clonable 和 Serializable 接口
`EnumSet` 类还实现了 `Cloneable` 和 `Serializable` 接口。
Cloneable 接口
它允许 `EnumSet` 类创建该类实例的副本。
Serializable 接口
每当 Java 对象需要在网络上传输时,对象都需要被转换为比特或字节。这是因为 Java 对象无法在网络上传输。
`Serializable` 接口允许类被序列化。这意味着实现 `Serializable` 的类的对象可以被转换为比特或字节。
为什么选择 EnumSet?
与其他集合实现(如 `HashSet`、`TreeSet`)相比,`EnumSet` 提供了一种存储枚举值的有效方法。
枚举集仅存储特定枚举的枚举值。因此,JVM 已经知道该集合的所有可能值。
这就是为什么枚举集在内部实现为一系列比特的原因。比特指定元素是否存在于枚举集中。
如果元素存在于集合中,则对应元素的比特会被设置为 1。