Java EnumSet
在本教程中,我们将借助示例学习Java EnumSet类及其各种方法。
Java集合框架的EnumSet类提供了单个枚举的元素的集合实现。
在学习EnumSet之前,请确保了解
Java Enums
。
它实现
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
例如,
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,
注意事项
:
删除EnumSet元素
例如,
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已经知道该集合的所有可能值。
这就是为什么枚举集在内部被实现为位序列的原因。位指定元素是否出现在枚举集中。
如果集合中存在该元素,则将其对应的位打开。