Java 枚举 EnumSet

在Java中,枚举类型是一种特殊的数据类型,用于定义一组固定的常量。枚举类型的常量可以作为变量使用,并且可以对它们进行比较。Java提供了EnumSet类来处理枚举类型,它提供了一种高效的方式来操作枚举常量的集合。

EnumSet概述

EnumSet是Java集合框架中的一个类,它实现了Set接口,用于存储枚举类型的值。与其他集合类不同的是,EnumSet的元素必须是同一个枚举类型的枚举常量。

EnumSet提供了一些特殊的优化,使得它在存储和访问枚举常量时非常高效。它内部使用位向量来表示集合,这种表示方式在空间和时间上都比较高效。

创建EnumSet

创建EnumSet的方式主要有两种:通过EnumSet.allOf方法创建包含所有枚举常量的集合,或者通过EnumSet.of方法创建包含指定枚举常量的集合。

下面是一个使用EnumSet创建集合的示例:

enum Days {
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

EnumSet<Days> weekend = EnumSet.of(Days.SATURDAY, Days.SUNDAY);
EnumSet<Days> weekdays = EnumSet.complementOf(weekend);

System.out.println(weekend);  // 输出 [SATURDAY, SUNDAY]
System.out.println(weekdays); // 输出 [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]

在上面的示例中,我们首先定义了一个枚举类型Days,包含一周的所有天。然后使用EnumSet.of方法创建了一个包含周末的集合weekend,另一个集合weekdays则包含了除了周末以外的所有天。

EnumSet的常用操作

EnumSet提供了一些常用的操作方法,包括添加、删除、合并和比较等。

添加元素

EnumSet提供了add和addAll方法来添加元素到集合中。下面是一个示例:

EnumSet<Days> days = EnumSet.noneOf(Days.class);
days.add(Days.MONDAY);
days.addAll(EnumSet.of(Days.TUESDAY, Days.WEDNESDAY));

System.out.println(days); // 输出 [MONDAY, TUESDAY, WEDNESDAY]

在上面的示例中,我们首先创建了一个空的EnumSet集合,然后使用add和addAll方法分别添加了一个枚举常量和一组枚举常量到集合中。

删除元素

EnumSet提供了remove和removeAll方法来删除集合中的元素。下面是一个示例:

EnumSet<Days> days = EnumSet.allOf(Days.class);
days.remove(Days.MONDAY);
days.removeAll(EnumSet.of(Days.TUESDAY, Days.WEDNESDAY));

System.out.println(days); // 输出 [THURSDAY, FRIDAY, SATURDAY, SUNDAY]

在上面的示例中,我们首先创建了一个包含所有枚举常量的EnumSet集合,然后使用remove和removeAll方法分别删除了一个枚举常量和一组枚举常量。

合并集合

EnumSet提供了两种方式来合并集合:union和addAll方法。下面是一个示例:

EnumSet<Days> set1 = EnumSet.of(Days.MONDAY, Days.TUESDAY);
EnumSet<Days> set2 = EnumSet.of(Days.TUESDAY, Days.WEDNESDAY);

EnumSet<Days> union = EnumSet.copyOf(set1);
union.addAll(set2);

System.out.println(union); // 输出 [MONDAY, TUESDAY, WEDNESDAY]

在上面的示例中,我们首先创建了两个EnumSet集合set1和set2,然后使用copyOf方法创建了一个set1的副本union,最后使用addAll方法将set2合并到union中。

比较集合

EnumSet提供了equals和containsAll方法来比较集合。下面是一个示例:

EnumSet<Days> set1 = EnumSet.of(Days.MONDAY, Days.TUESDAY);
EnumSet<