Java 枚举集

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

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

它实现了Set接口

Java EnumSet class implements the Java Set interface.


创建 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()` 方法创建一个枚举集,其中包含枚举类型 e1e2 之间的所有值,包括这两个值。例如,

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。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战