8.3.4 EnumSet类
8.3.4 EnumSet类
EnumSet
是一个专为枚举类设计的集合类, EnumSet
中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet
时显式或隐式地指定。
EnumSet有序
EnumSet
的集合元素也是有序的, EnumSet
以枚举值在Enum
类内的定义顺序来决定集合元素的顺序。
EnumSet以向量存储 内存占用小
EnumSet
在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet
对象占用内存很小,而且运行效率很好,尤其是调用containsAll()
,retainAll()
等方法来进行批量操作时。如果其参数也是EnumSet
集合,则该批量操作的执行速度也非常快。
EnumSet中不能加入null
EnumSet
集合不允许加入null
元素,如果试图插入null
元素, EnumSet
将抛出NullPointerException
异常。如果只是想判断EnumSet
是否包含null
元素或试图删除null
元素都不会抛出异常,只是删除操作将返回false
,因为EnumSet
中无法存入null
,所以根本没有任何null
元素被删除。
EnumSet不提供构造器,通过类方法来创建EnumSet对象
EnumSet
类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的类方法来创建EnumSet
对象。
常用EnumSet类方法
EnumSet
类它提供了如下常用的类方法来创建EnumSet
对象。
创建所有枚举值构成的EnumSet
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) |
创建一个包含指定枚举类里所有枚举值的EnumSet 集合。 |
创建EnumSet的补集构成的EnumSet
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) |
创建一个其元素类型与指定EnumSet 里元素类型相同的EnumSet 集合,新EnumSet 集合包含原EnumSet 集合所不包含的、此枚举类剩下的枚举值(即新EnumSet 集合和原EnumSet 集合的集合元素加起来就是该枚举类的所有枚举值)。就是类似求差集 |
复制Collection集合或者其他EnumSet中的所有元素来创建EnumSet
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) |
使用一个普通集合来创建EnumSet 集合。 |
static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) |
Creates an enum set with the same element type as the specified enum set, initially containing the same elements (if any). |
创建 指定枚举类型的 空的EnumSet
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) |
创建一个元素类型为指定枚举类型的空EnumSet |
直接给定的枚举值来创建EnumSet
of
方法可以创建一个包含一个或多个枚举值的EnumSet
集合,传入的多个枚举值必须属于同一个枚举类。
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> of(E e) |
Creates an enum set initially containing the specified element. |
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) |
Creates an enum set initially containing the specified elements. |
static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) |
Creates an enum set initially containing the specified elements. |
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) |
Creates an enum set initially containing the specified elements. |
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) |
Creates an enum set initially containing the specified elements. |
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5) |
Creates an enum set initially containing the specified elements. |
创建指定区间之间的枚举值构成的EnumeSet
方法 | 描述 |
---|---|
static <E extends Enum<E>> EnumSet<E> range(E from, E to) |
创建一个包含从from 枚举值到to 枚举值范围内所有枚举值的EnumSet 集合。 |
程序 创建EnumSet的各种姿势
下面程序示范了如何使用EnumSet
来保存枚举类的多个枚举值。
1 | import java.util.*; |
运行效果:
1 | [SPRING, SUMMER, FALL, WINTER] |
通过复制集合中的元素来创建EnumSet
除此之外,还可以复制另一个EnumSet
集合中的所有元素来创建新的EnumSet
集合,或者复制另一个Collection
集合中的所有元素来创建新的EnumSet
集合。当复制Collection
集合中的所有元素来创建新的EnumSet
集合时,要求Collection
集合中的所有元素必须是同一个枚举类的枚举值。
复制Collection来创建EnumSet的前提
当试图复制一个Collection
集合里的元素来创建EnumSet
集合时,必须保证Collection
集合里的所有元素都是同一个枚举类的枚举值
程序 复制集合中的元素来创建EnumSet
下面程序示范了这个用法。
1 | import java.util.*; |
上面程序中表示的①,和②处的代码没有任何区别,只是因为执行②行代码时,c集合中的元素不全是枚举值,而是包含了两个字符串对象,所以在②行代码处抛出ClassCastException
异常