English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,我们将借助示例学习Java EnumSet类及其各种方法。
Java集合框架的EnumSet类提供了单个枚举的元素的集合实现。
在学习EnumSet之前,请确保了解Java Enums。
它实现Set接口。
为了创建一个枚举集,我们必须首先导入java.util.EnumSet包。
与其他集合实现不同,枚举集合没有公共构造函数。我们必须使用预定义的方法来创建一个枚举集。
allof()方法创建一个枚举集,其中包含指定枚举类型Size的所有值。 例如,
import java.util.EnumSet; class Main { //一个名为Size的枚举 enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //Crear un EnumSet utilizando allOf() EnumSet<Size> sizes = EnumSet.allOf(Size.class); System.out.println("EnumSet: " + sizes); } }
Resultados de salida
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
注意声明,
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
在这里,Size.class表示我们创建的Size枚举。
noneOf()方法创建一个空的枚举集。例如,
import java.util.EnumSet; class Main { //一个名为Size的枚举 enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { // Crear un EnumSet utilizando noneOf() EnumSet<Size> sizes = EnumSet.noneOf(Size.class); System.out.println("空EnumSet: " + sizes); } }
Resultados de salida
空EnumSet : []
在这里,我们创建了一个名为sizes的空枚举。
注意:我们只能在上述程序中插入枚举类型为Size的元素。 这是因为我们使用Size枚举创建了空的枚举集。
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); } }
Resultados de salida
EnumSet: [MEDIUM, LARGE, EXTRALARGE]
El método of() crea un conjunto de enumeraciones que contiene los elementos especificados. Por ejemplo,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //Utilizar of() con un solo parámetro 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); } }
Resultados de salida
EnumSet1: [MEDIUM] EnumSet2: [SMALL, LARGE]
La clase EnumSet proporciona varios métodos que permiten realizar varias operaciones en el conjunto de enumeraciones.
add() - Insertar el valor de enumeración especificado en el conjunto de enumeraciones
addAll() - Insertar todos los elementos del conjunto especificado en el conjunto
Por ejemplo,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //Crear un EnumSet utilizando allOf() EnumSet<Size> sizes1 = EnumSet.allOf(Size.class); //Crear un EnumSet utilizando noneOf() EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class); //Agregar elementos utilizando el método add sizes2.add(Size.MEDIUM); System.out.println("EnumSet utilizando el método add(): " + sizes2); //Utilizar el método addAll() sizes2.addAll(sizes1); System.out.println("EnumSet utilizando el método addAll(): " + sizes2); } }
Resultados de salida
EnumSet utilizando el método add(): [MEDIUM] EnumSet utilizando el método addAll(): [SMALL, MEDIUM, LARGE, EXTRALARGE]
En el ejemplo anterior, usamos el método addAll() para insertar sizes1Insertar todos los elementos del conjunto de enumeraciones en sizes2de conjunto de enumeraciones.
También se puede usar addAll() para insertar elementos de otros conjuntos (como ArrayList, LinkedList, etc.) en el conjunto de enumeraciones. Sin embargo, todos los conjuntos deben tener el mismo tipo de enumeración.
Para acceder a los elementos del conjunto de enumeraciones, podemos usar el método iterator(). Para utilizar este método, debemos importar el paquete java.util.Iterator. Por ejemplo,
import java.util.EnumSet; import java.util.Iterator; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //Crear un EnumSet utilizando allOf() 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(", "); } } }
Resultados de salida
EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,
Consideraciones:
hasNext() - Devuelve true si hay un siguiente elemento en el conjunto de enumeración
next() - Devuelve el siguiente elemento del conjunto de enumeración
remove() - Elimina el elemento especificado de la colección de enumeración
removeAll() - Elimina todos los elementos de la colección de enumeración
Por ejemplo,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //Usa allOf() para crear EnumSet EnumSet<Size> sizes = EnumSet.allOf(Size.class); System.out.println("EnumSet: " + sizes); // Usa remove() boolean value1 = sizes.remove(Size.MEDIUM); System.out.println("¿Se ha eliminado MEDIUM? " + value1); // Usa removeAll() boolean value2 = sizes.removeAll(sizes); System.out.println("¿Se han eliminado todos los elementos? " + value2); } }
Resultados de salida
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE] ¿Se ha eliminado MEDIUM? true ¿Se han eliminado todos los elementos? true
Método | Descripción |
---|---|
copyOf() | Crea una copia de EnumSet |
contains() | Búsca el elemento especificado por EnumSet y devuelve un resultado booleano |
isEmpty() | Verifica si EnumSet está vacío |
size() | Devuelve el tamaño de EnumSet |
clear() | 从EnumSet中删除所有元素 |
EnumSet类还实现了Cloneable和Serializable接口。
克隆接口(Cloneable)
它允许EnumSet类制作该类实例的副本。
可序列化的接口(Serializable)
每当需要通过网络传输Java对象时,就需要将对象转换为位或字节。这是因为Java对象无法通过网络传输。
该Serializable接口允许类被序列化。这意味着Serializable可以将实现的类的对象转换为位或字节。
枚举集提供了一种比其他set实现(如HashSet、TreeSet)更有效的存储枚举值的方法。
枚举集仅存储特定枚举的枚举值。 因此,JVM已经知道该集合的所有可能值。
这就是为什么枚举集在内部被实现为位序列的原因。位指定元素是否出现在枚举集中。
如果集合中存在该元素,则将其对应的位打开。