Java集合框架的EnumSet
类提供了单个枚举的元素的集合实现。
在学习EnumSet之前,请确保了解Java Enums。
它实现了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()
方法创建一个枚举集,其中包含e1和e2之间的枚举的所有值,包括两个值。例如,
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()
将指定集合的所有元素插入集合中
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()
将其他集合中的元素(例如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) {
// 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()
-从枚举集中删除所有元素
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
类还实现了Cloneable
和Serializable
接口。
克隆界面
它允许EnumSet
类制作该类实例的副本。
可序列化的接口
每当需要通过网络传输Java对象时,就需要将对象转换为位或字节。这是因为Java对象无法通过网络传输。
Serializable
接口允许对类进行序列化。这意味着可以将实现Serializable
的类的对象转换为位或字节。
为什么选择EnumSet?
与其他set实现(例如HashSet
, TreeSet
)相比, EnumSet
提供了一种存储枚举值的有效方法。
枚举集仅存储特定枚举的枚举值。因此,JVM已经知道该集合的所有可能值。
这就是为什么枚举集在内部被实现为一系列位的原因。位指定元素是否存在于枚举集中。
如果集合中存在该元素,则将其对应的位打开。