English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Manejo de excepciones en Java

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

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) {
        //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枚举。

2.使用noneOf(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枚举创建了空的枚举集。

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);
    }
}

Resultados de salida

EnumSet: [MEDIUM, LARGE, EXTRALARGE]

4.usar el método of()

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]

Métodos de EnumSet

La clase EnumSet proporciona varios métodos que permiten realizar varias operaciones en el conjunto de enumeraciones.

Insertar el elemento en EnumSet

  • 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.

Acceder a los elementos del EnumSet

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

Elimina elementos de EnumSet

  • 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

Otros métodos

MétodoDescripció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可以将实现的类的对象转换为位或字节。

为什么选择EnumSet?

枚举集提供了一种比其他set实现(如HashSet、TreeSet)更有效的存储枚举值的方法。

枚举集仅存储特定枚举的枚举值。 因此,JVM已经知道该集合的所有可能值。

这就是为什么枚举集在内部被实现为位序列的原因。位指定元素是否出现在枚举集中。

如果集合中存在该元素,则将其对应的位打开。