跳到主要内容

Java EnumSet 类

提示
  1. 专为枚举设计的集合EnumSet 是专门为枚举类型设计的集合,实现了 Set 接口,为枚举元素提供了高效的集合操作。
  2. 创建和使用 EnumSet:创建 EnumSet 不使用公共构造函数,而是通过预定义方法如 allOf(), noneOf(), range(), 和 of() 来创建。
  3. 枚举集合操作EnumSet 提供了各种操作,包括添加 (add(), addAll()), 访问 (iterator()), 移除 (remove(), removeAll()) 元素,以及其他标准集合操作,如 size()clear()

Java 集合框架中的 EnumSet 类提供了单个枚举元素的集合实现。

在了解 EnumSet 之前,请确保了解 Java 枚举

它实现了 Set 接口

Java EnumSet 类实现了 Java Set 接口。

创建 EnumSet

要创建枚举集合,我们首先必须导入 java.util.EnumSet 包。

与其他集合实现不同,枚举集合没有公共构造函数。我们必须使用预定义的方法来创建枚举集合。

1. 使用 allOf(Size)

allOf() 方法创建一个包含指定枚举类型 Size 的所有值的枚举集合。例如,

import java.util.EnumSet;

class Main {
// 一个名为 Size 的枚举
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}

public static void main(String[] args) {

// 使用 allOf() 创建 EnumSet
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 {

// 一个名为 Size 的枚举类型
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}

public static void main(String[] args) {

// 使用 noneOf() 创建 EnumSet
EnumSet<Size> sizes = EnumSet.noneOf(Size.class);

System.out.println("Empty EnumSet: " + sizes);
}
}

输出

Empty EnumSet : []

在这里,我们创建了一个名为 sizes 的空枚举集合。

注意:在上述程序中,我们只能插入枚举类型 Size 的元素。因为我们使用 Size 枚举创建了我们的空枚举集合。

3. 使用 range(e1, e2) 方法

range() 方法创建一个包含从 e1e2(包括两者)之间所有枚举值的枚举集合。例如,

import java.util.EnumSet;

class Main {

enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}

public static void main(String[] args) {

// 使用 range() 创建 EnumSet
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) {

// 使用单个参数的 of() 方法
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) {

// 使用 allOf() 创建 EnumSet
EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);

// 使用 noneOf() 创建 EnumSet
EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);

// 使用 add 方法
sizes2.add(Size.MEDIUM);
System.out.println("使用 add() 的 EnumSet: " + sizes2);

// 使用 addAll() 方法
sizes2.addAll(sizes1);
System.out.println("使用 addAll() 的 EnumSet: " + sizes2);
}
}

输出

使用 add(): [MEDIUM]
使用 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) {

// 使用 allOf() 创建 EnumSet
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) {

// 使用 allOf() 创建 EnumSet
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);

// 使用 remove()
boolean value1 = sizes.remove(Size.MEDIUM);
System.out.println("是否移除了 MEDIUM? " + value1);

// 使用 removeAll()
boolean value2 = sizes.removeAll(sizes

);
System.out.println("是否移除了所有元素? " + value2);
}
}

输出

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
是否移除了 MEDIUMtrue
是否移除了所有元素? true

其他方法

方法描述
copyOf()创建 EnumSet 的副本
contains()搜索 EnumSet 中的指定元素,并返回布尔结果
isEmpty()检查 EnumSet 是否为空
size()返回 EnumSet 的大小
clear()EnumSet 中移除所有元素

可克隆和可序列化接口

EnumSet 类还实现了 CloneableSerializable 接口。

Cloneable 接口

它允许 EnumSet 类制作类实例的副本。

Serializable 接口

当 Java 对象需要通过网络传输时,需要将对象转换为位或字节。这是因为 Java 对象无法通过网络传输。

Serializable 接口允许类进行序列化。这意味着实现 Serializable 的类的对象可以转换为位或字节。

为什么使用 EnumSet?

EnumSet 提供了一种比其他集合实现(如 HashSet, TreeSet)更高效的存储枚举值的方式。

枚举集合只存储特定枚举的枚举值。因此,JVM 已经知道集合的所有可能值。

这就是为什么枚举集合在内部是作为一系列位实现的。位指定枚举集合中是否存在元素。

如果集合中存在该元素,则相应元素的位被打开。