Java EnumSet

EnumSet 中的元素的数据类型只能是枚举类型。在本教程中,我们将借助示例了解 Java EnumSet 类及其各种方法。

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

EnumSet 中的元素的数据类型只能是枚举类型。EnumSet 是一个枚举数据元素的集合。

在您了解 EnumSet 之前,请先了解 Java 枚举

EnumSet 是一个抽象类。

创建 EnumSet

EnumSet 是一个抽象类,没有提供公共的构造方法,但是提供了几个静态的工厂方法以创建 EnumSet 对象。

allOf()

allof() 方法创建一个 EnumSet,参数是指定枚举类型对应的 Class 对象,将指定枚举类型所有的枚举值放入集合中。 例如,

import java.util.EnumSet;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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 对应的 Class 对象。

noneOf()

noneOf() 方法创建一个空的 EnumSet 。例如,

import java.util.EnumSet;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
    System.out.println("EnumSet: " + sizes);
  }
}

输出

EnumSet: []

在这里,我们创建了一个名为 sizes 的空 EnumSet。

range(e1, e2)

range() 方法创建一个 EnumSet ,其元素是一个枚举类型的 e1 和 e2 之间的所有枚举值,包括这两个值。例如,

import java.util.EnumSet;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
    System.out.println("EnumSet: " + sizes);
  }
}

输出

EnumSet: [MEDIUM, LARGE, EXTRALARGE]

of()

of() 方法创建一个包含由参数指定枚举值的 EnumSet 。例如,

import java.util.EnumSet;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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() - 将指定的元素添加到 EnumSet 集合中
  • addAll() - 将指定集合的所有元素添加到 EnumSet 集合中

例如,

import java.util.EnumSet;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {

    EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
    EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);

    sizes2.add(Size.MEDIUM);
    System.out.println("EnumSet Using add(): " + sizes2);

    sizes2.addAll(sizes1);
    System.out.println("EnumSet Using addAll(): " + sizes2);
  }
}

输出

EnumSet Using add(): [MEDIUM]
EnumSet Using addAll(): [SMALL, MEDIUM, LARGE, EXTRALARGE]

EnumSet 迭代器

iterator() 返回一个迭代器,可以迭代当前 HashSet 对象中的元素。

import java.util.EnumSet;
import java.util.Iterator;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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,

关于迭代器的更多信息,请转到 Java 迭代器章节查看。

删除 EnumSet 元素

  • remove() - 从 EnumSet 集合中删除指定的元素
  • removeAll() - 从 EnumSet 集合中删除由参数指定的另一个集合的所有元素

例如,

import java.util.EnumSet;

public class Main {

  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    EnumSet<Size> sizes = EnumSet.allOf(Size.class);
    System.out.println("EnumSet: " + sizes);

    boolean value1 = sizes.remove(Size.MEDIUM);
    System.out.println("Is MEDIUM removed? " + value1);

    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

EnumSet 的其他方法

  • clone() - 克隆一个 EnumSet
  • contains() - 如果 EnumSet 包含指定元素,则返回 true
  • isEmpty() - 检查 EnumSet 是否为空
  • size() - 返回 EnumSet 大小
  • clear() - 清空 EnumSet

为什么要用 EnumSet ?

其他集合实现(如 HashSet , TreeSet )相比,EnumSet 限定了其中的元素的类型只能是枚举类型,这将具有更安全的数据类型。

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

这就是为什么 EnumSet 在内部使用位序列作为底层实现的原因。位的值(01)就确定了枚举值是否存在于 EnumSet 中。如果枚举值存在于集合中,则相应的位的值就设置位 1