在本教程中,我们将借助示例学习 Java EnumSet类及其各种方法。
Java 集合框架的EnumSet类提供了单个枚举的元素的一组实现。
在学习EnumSet之前,请确保了解 Java 枚举。
它实现了Set接口。

创建EnumSet
为了创建一个枚举集,我们必须首先导入java.util.EnumSet包。
与其他集合实现不同,枚举集合没有公共构造器。 我们必须使用预定义的方法来创建一个枚举集。
1.使用allOf(Size)
allof()方法创建一个枚举集,其中包含指定枚举类型size的所有值。 例如,
import java.util.EnumSet;class Main {// an enum named Sizeenum 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 Sizeenum 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。
注意:在上述程序中,我们只能插入枚举类型为sizes的元素。 这是因为我们使用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 parameterEnumSet<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 methodsizes2.add(Size.MEDIUM);System.out.println("EnumSet Using add(): " + sizes2);// Using addAll() methodsizes2.addAll(sizes1);System.out.println("EnumSet Using addAll(): " + sizes2);}}
输出:
EnumSet using add(): [MEDIUM]EnumSet using addAll(): [SMALL, MEDIUM, LARGE, EXTRALARGE]
在上面的示例中,我们使用addAll()方法将枚举集size1的所有元素插入到枚举集size2中。
还可以使用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? trueAre all elements removed? true
其他方法
| 方法 | 描述 |
|---|---|
copyOf() |
创建EnumSet的副本 |
contains() |
在EnumSet中搜索指定的元素,并返回布尔结果 |
isEmpty() |
检查EnumSet是否为空 |
size() |
返回EnumSet的大小 |
clear() |
从EnumSet中删除所有元素 |
Cloneable和Serializable接口
EnumSet类还实现Cloneable和Serializable接口。
Cloneable的接口
它允许EnumSet类制作该类实例的副本。
Serializable接口
每当需要通过网络传输 Java 对象时,就需要将对象转换为位或字节。 这是因为 Java 对象无法通过网络传输。
Serializable接口允许对类进行序列化。 这意味着可以将实现Serializable的类的对象转换为位或字节。
为什么选择EnumSet?
与其他集合实现(例如HashSet,TreeSet)相比,EnumSet提供了一种存储枚举值的有效方法。
枚举集仅存储特定枚举的枚举值。 因此,JVM 已经知道该集合的所有可能值。
这就是为什么枚举集在内部被实现为一系列位的原因。 位指定元素是否存在于枚举集中。
如果集合中存在该元素,则将其对应的位打开。
