📜  Java EnumSet

📅  最后修改于: 2020-09-26 14:28:38             🧑  作者: Mango

在本教程中,我们将借助示例学习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 {
    // an enum named Size
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    
    public static void main(String[] args) {

        // Creating an EnumSet using allOf()
        EnumSet sizes = EnumSet.allOf(Size.class);

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

}

输出

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]

注意声明,

EnumSet 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 sizes = EnumSet.noneOf(Size.class);

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

输出

Empty EnumSet : []

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

注意 :我们只能在上述程序中插入枚举类型为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 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 sizes1 = EnumSet.of(Size.MEDIUM);
        System.out.println("EnumSet1: " + sizes1);

        EnumSet 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 sizes1 = EnumSet.allOf(Size.class);

        // Creating an EnumSet using noneOf()
        EnumSet 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()方法将枚举集大小1的所有元素插入到枚举集大小2中

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


访问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 sizes = EnumSet.allOf(Size.class);

        Iterator 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 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

其他方法
Method Description
copyOf() Creates a copy of the EnumSet
contains() Searches the EnumSet for the specified element and returns a boolean result
isEmpty() Checks if the EnumSet is empty
size() Returns the size of the EnumSet
clear() Removes all the elements from the EnumSet

可克隆和可序列化的接口

EnumSet类还实现了CloneableSerializable接口。

克隆界面

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

可序列化的接口

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

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


为什么选择EnumSet?

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

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

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

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