原文: https://www.programiz.com/java-programming/enumset

在本教程中,我们将借助示例学习 Java EnumSet类及其各种方法。

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

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

它实现了Set接口

Java `EnumSet` - 图1


创建EnumSet

为了创建一个枚举集,我们必须首先导入java.util.EnumSet包。

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

1.使用allOf(Size)

allof()方法创建一个枚举集,其中包含指定枚举类型size的所有值。 例如,

  1. import java.util.EnumSet;
  2. class Main {
  3. // an enum named Size
  4. enum Size {
  5. SMALL, MEDIUM, LARGE, EXTRALARGE
  6. }
  7. public static void main(String[] args) {
  8. // Creating an EnumSet using allOf()
  9. EnumSet<Size> sizes = EnumSet.allOf(Size.class);
  10. System.out.println("EnumSet: " + sizes);
  11. }
  12. }

输出

  1. EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]

注意声明,

  1. EnumSet<Size> sizes = EnumSet.allOf(Size.class);

在这里,Size.class表示我们创建的Size枚举。


2.使用noneOf(Size)

noneOf()方法创建一个空的枚举集。 例如,

  1. import java.util.EnumSet;
  2. class Main {
  3. // an enum type Size
  4. enum Size {
  5. SMALL, MEDIUM, LARGE, EXTRALARGE
  6. }
  7. public static void main(String[] args) {
  8. // Creating an EnumSet using noneOf()
  9. EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
  10. System.out.println("Empty EnumSet: " + sizes);
  11. }
  12. }

输出

  1. Empty EnumSet : []

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

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


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

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

  1. import java.util.EnumSet;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumSet using range()
  8. EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
  9. System.out.println("EnumSet: " + sizes);
  10. }
  11. }

输出

  1. EnumSet: [MEDIUM, LARGE, EXTRALARGE]

4.使用of()方法

of()方法创建一个包含指定元素的枚举集。 例如,

  1. import java.util.EnumSet;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Using of() with a single parameter
  8. EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
  9. System.out.println("EnumSet1: " + sizes1);
  10. EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
  11. System.out.println("EnumSet2: " + sizes2);
  12. }
  13. }

输出

  1. EnumSet1: [MEDIUM]
  2. EnumSet2: [SMALL, LARGE]

EnumSet的方法

EnumSet类提供了使我们能够对枚举集执行各种元素的方法。


将元素插入EnumSet

  • add() - 将指定的枚举值插入到枚举集中
  • addAll()将指定集合的所有元素插入集合

例如,

  1. import java.util.EnumSet;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumSet using allOf()
  8. EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
  9. // Creating an EnumSet using noneOf()
  10. EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);
  11. // Using add method
  12. sizes2.add(Size.MEDIUM);
  13. System.out.println("EnumSet Using add(): " + sizes2);
  14. // Using addAll() method
  15. sizes2.addAll(sizes1);
  16. System.out.println("EnumSet Using addAll(): " + sizes2);
  17. }
  18. }

输出

  1. EnumSet using add(): [MEDIUM]
  2. EnumSet using addAll(): [SMALL, MEDIUM, LARGE, EXTRALARGE]

在上面的示例中,我们使用addAll()方法将枚举集size1的所有元素插入到枚举集size2中。

还可以使用addAll()将其他集合中的元素(例如ArrayListLinkedList等)插入到枚举集中。 但是,所有集合都应具有相同的枚举类型。


访问EnumSet元素

要访问枚举集的元素,我们可以使用iterator()方法。 为了使用此方法,我们必须导入java.util.Iterator包。 例如,

  1. import java.util.EnumSet;
  2. import java.util.Iterator;
  3. class Main {
  4. enum Size {
  5. SMALL, MEDIUM, LARGE, EXTRALARGE
  6. }
  7. public static void main(String[] args) {
  8. // Creating an EnumSet using allOf()
  9. EnumSet<Size> sizes = EnumSet.allOf(Size.class);
  10. Iterator<Size> iterate = sizes.iterator();
  11. System.out.print("EnumSet: ");
  12. while(iterate.hasNext()) {
  13. System.out.print(iterate.next());
  14. System.out.print(", ");
  15. }
  16. }
  17. }

输出

  1. EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,

注意

  • 如果枚举集中存在下一个元素,则hasNext()返回true
  • next()返回枚举集中的下一个元素

删除EnumSet元素

  • remove() - 从枚举集中删除指定的元素
  • removeAll() - 从枚举集中删除所有元素

例如:

  1. import java.util.EnumSet;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating EnumSet using allOf()
  8. EnumSet<Size> sizes = EnumSet.allOf(Size.class);
  9. System.out.println("EnumSet: " + sizes);
  10. // Using remove()
  11. boolean value1 = sizes.remove(Size.MEDIUM);
  12. System.out.println("Is MEDIUM removed? " + value1);
  13. // Using removeAll()
  14. boolean value2 = sizes.removeAll(sizes);
  15. System.out.println("Are all elements removed? " + value2);
  16. }
  17. }

输出

  1. EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
  2. Is MEDIUM removed? true
  3. Are all elements removed? true

其他方法

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

CloneableSerializable接口

EnumSet类还实现CloneableSerializable接口。

Cloneable的接口

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

Serializable接口

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

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


为什么选择EnumSet

与其他集合实现(例如HashSetTreeSet)相比,EnumSet提供了一种存储枚举值的有效方法。

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

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

如果集合中存在该元素,则将其对应的位打开。