原文: https://javatutorial.net/java-enumset-example

Java EnumSet类实现Set并将其与枚举类型一起使用。EnumSet(顾名思义)只能包含枚举值,并且所有值都属于同一个枚举。 此外,EnumSet不允许使用空值,这意味着它会抛出NullPointerException尝试添加空值。 它不是线程安全的,这意味着,如果需要,我们需要在外部进行同步。

Java `EnumSet`示例 - 图1

继承图

Java `EnumSet`示例 - 图2

枚举集

为什么使用EnumSet

每当我们必须存储枚举值时,EnumSet应该始终是最佳的Set实现。 所有基本操作都以固定的time(1)复杂度执行,这非常快。 这是由于EnumSet类中的所有方法都是使用算术按位运算(<<>>&等)实现的。 总而言之,EnumSet非常有效,因为它使用较少的内存并且速度也很快。

EnumSet中的方法

  1. EnumSet<E> close():返回当前集合的副本。
  2. static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType):创建一个枚举集,该枚举集包含该枚举中的所有元素 指定的元素类型。
  3. static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s):创建与指定元素类型相同的枚举集 枚举集合,最初包含此类型的所有元素,这些元素不包含在指定集合中。
  4. static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c):创建一个从指定集合初始化的集合。
  5. static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s):创建一个与指定元素类型相同的枚举集,包含相同的元素(如果有)。
  6. static <E extends Enum<E>> EnumSet<E> of(E e):创建一个包含指定元素的枚举集。
  7. atic <E extends Enum<E>> EnumSet<E> range(E from, E to):创建一个枚举集,该枚举集包含在由两个参数指定的范围内的所有元素。

从类java.util.AbstractSet继承的方法

equals), hashCode) , removeAll)

从类java.util.AbstractCollection继承的方法

add), addAll) ,clear),include), containsAll) , isEmpty) ,iterator),remove), keepAll) ,size), toArray) , toArray(T[])) , toString)

从类java.lang.Object继承的方法

finalize), getClass) ,notify), notifyAll) ,wait),wait(long))。

从接口java.util.Set继承的方法:

add), addAll) ,clear),contains), containsAll) , isEmpty) ,iterator),remove), retainAll) ,size), toArray) , toArray(T[]))

有关EnumSet主要方法的更多信息,请随时访问原始 Oracle 文档

  1. import java.util.EnumSet;
  2. enum Student
  3. {
  4. NAME, AGE, MAJOR, YEAR
  5. };
  6. public class EnumSetExample
  7. {
  8. public static void main(String[] args)
  9. {
  10. // initializing set
  11. EnumSet<Student> set1, set2, set3;
  12. // populating the sets using of(E e)
  13. enumSet1 = EnumSet.of(Student.NAME, Student.MAJOR, Student.YEAR);
  14. // will get all of the properties that have not been initialized to the
  15. // specified set (if any)
  16. enumSet2 = EnumSet.complementOf(enumSet1);
  17. // will get all of the properties that are present in the enumset
  18. enumSet3 = EnumSet.allOf(Student.class);
  19. // will get from age to year and everything in between the properties of the
  20. // enumset class
  21. enumSet4 = EnumSet.range(Student.AGE, Student.YEAR);
  22. System.out.println("Set 1: " + enumSet1);
  23. System.out.println("Set 2: " + enumSet2);
  24. System.out.println("Set 3: " + enumSet3);
  25. System.out.println("Set 4: " + enumSet4);
  26. }
  27. }

输出

  1. Set 1: {NAME, MAJOR, YEAR}
  2. Set 2: {AGE}
  3. Set 3: {NAME, AGE, MAJOR, YEAR}
  4. Set 4: {AGE, MAJOR, YEAR}