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 在内部使用位序列作为底层实现的原因。位的值(0
或 1
)就确定了枚举值是否存在于 EnumSet 中。如果枚举值存在于集合中,则相应的位的值就设置位 1
。