Java 菜鸟教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java EnumSet

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

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

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

它实现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("空EnumSet: " + sizes);
    }
}

输出结果

空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) {

        //使用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("EnumSet 使用 add()方法: " + sizes2);

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

输出结果

EnumSet 使用 add()方法: [MEDIUM]
EnumSet 使用 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]
MEDIUM是否已删除? true
所有的元素都被移除了吗? true

其他方法

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

可克隆和可序列化的接口

EnumSet类还实现了Cloneable和Serializable接口。

克隆接口(Cloneable)

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

可序列化的接口(Serializable)

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

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

为什么选择EnumSet?

枚举集提供了一种比其他set实现(如HashSet、TreeSet)更有效的存储枚举值的方法。

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

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

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