添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Java 菜鸟教程

  • Java 菜鸟教程
  • Java 开发环境安装
  • Java 入门程序
  • Java JDK, JRE和JVM
  • Java 基本数据类型
  • Java 变量类型
  • Java 运算符
  • Java 输入和输出
  • Java 表达式语句
  • Java 注释
  • Java 流程控制

  • Java if...else语句
  • Java switch语句
  • Java for循环
  • Java for-each循环
  • Java while循环
  • Java break语句
  • Java continue语句
  • Java 数组

  • Java 数组(Arrays)
  • Java 多维数组
  • Java 数组复制
  • Java 面向对象(I)

  • Java 类和对象
  • Java 方法
  • Java 构造函数
  • Java 修饰符
  • Java 字符串(String)
  • Java this 关键字
  • Java final 关键字
  • Java instanceof 关键字
  • Java 递归
  • Java 面向对象(II)

  • Java 继承
  • Java 方法重写
  • Java super 关键字
  • Java 抽象类和抽象方法
  • Java 接口(Interface)
  • Java 多态
  • Java 封装
  • Java 面向对象(III)

  • Java 嵌套和内部类
  • Java 嵌套静态类
  • Java 匿名类
  • Java 单例模式
  • Java 枚举(Enum)
  • Java 枚举构造函数
  • Java 枚举与字符串
  • Java 反射(Reflection)
  • Java 包(package)
  • Java 异常处理

  • Java 异常(Exceptions)
  • Java 异常处理
  • Java throw和throws 关键字
  • Java 处理多个异常
  • Java try-with-resources
  • Java 注解(Annotations)
  • Java 日志(Logging)
  • Java 断言(Assert)
  • Java 列表(List)

  • Java 集合框架
  • Java 集合接口(Collection)
  • Java List(列表)
  • Java ArrayList
  • Java Vector(向量)
  • Java Stack(堆栈)
  • Java Queue(队列)

  • Java Queue 接口
  • Java PriorityQueue
  • Java Deque 接口
  • Java LinkedList(链表)
  • Java ArrayDeque
  • Java Map集合

  • Java Map接口
  • Java HashMap
  • Java LinkedHashMap
  • Java ConcurrentHashMap
  • Java Set集合

  • Java Set 接口
  • Java HashSet 类
  • Java Algorithms(算法)
  • Java Iterator 接口
  • Java ListIterator 接口
  • Java 输入输出(I/O)

  • Java I/O 流
  • Java InputStream 类
  • Java OutputStream 类
  • Java Reader/Writer

  • Java Reader 类
  • Java Writer 类
  • Java FileReader 类
  • Java FileWriter 类
  • Java 其他主题

  • Java Scanner 类
  • Java 类型转换
  • Java 自动装箱和拆箱
  • Java Lambda 表达式
  • Java 泛型
  • Java File 类
  • Java 包装类(Wrapper)
  • Java 命令行参数
  • Java 序列化
  • Java 网络编程
  • Java 发送邮件
  • Java 多线程编程
  • Java Applet 基础
  • Java 文档注释
  • Java 8 新特性
  • Java EnumSet

    在本教程中,我们将借助示例学习Java EnumSet类及其各种方法。

    Java集合框架的EnumSet类提供了单个枚举的元素的集合实现。

    在学习EnumSet之前,请确保了解 Java Enums

    它实现 Set接口

    Java EnumSet类实现Java 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已经知道该集合的所有可能值。

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

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