在本教程中,我们将借助示例学习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
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已经知道该集合的所有可能值。
这就是为什么枚举集在内部被实现为位序列的原因。位指定元素是否出现在枚举集中。
如果集合中存在该元素,则将其对应的位打开。