public abstract class EnumSet<E extends Enum<E>>
与枚举类型一起使用的专用 Set
实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于int 的“位标志”的替换形式,具有高品质、类型安全的优势。如果其参数也是一个枚举 set,则批量操作(如 containsAll 和retainAll)也应运行得非常快。
由 iterator 方法返回的迭代器按其自然顺序 遍历这些元素(该顺序是声明枚举常量的顺序)。返回的迭代器是弱一致的:它从不抛出ConcurrentModificationException
,也不一定显示在迭代进行时发生的任何 set 修改的效果。
不允许使用 null 元素。试图插入 null 元素将抛出 NullPointerException
。但是,试图测试是否出现 null 元素或移除 null 元素将不会抛出异常。
像大多数 collection 实现一样,EnumSet 是不同步的。如果多个线程同时访问一个枚举 set,并且至少有一个线程修改该 set,则此枚举 set 在外部应该是同步的。这通常是通过对自然封装该枚举 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSet(java.util.Set)
方法来“包装”该 set。最好在创建时完成这一操作,以防止意外的非同步访问:
Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
实现注意事项:所有基本操作都在固定时间内执行。虽然并不保证,但它们很可能比其 HashSet
副本更快。如果其参数也是一个枚举 set ,则批量操作会在固定时间内执行。
此类是 Java Collections Framework 的成员。
EnumMap
方法摘要 | ||
---|---|---|
static
|
allOf(Class<E> elementType) 创建一个包含指定元素类型的所有元素的枚举 set。 |
|
EnumSet<E> |
clone() 返回 set 的副本。 |
|
static
|
complementOf(EnumSet<E> s) 创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含指定 set 中所不 包含的此类型的所有元素。 |
|
static
|
copyOf(Collection<E> c) 创建一个从指定 collection 初始化的枚举 set。 |
|
static
|
copyOf(EnumSet<E> s) 创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含相同的元素(如果有的话)。 |
|
static
|
noneOf(Class<E> elementType) 创建一个具有指定元素类型的空枚举 set。 |
|
static
|
of(E e) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E first, E... rest) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3, E e4) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3, E e4, E e5) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
range(E from, E to) 创建一个最初包含由两个指定端点所定义范围内的所有元素的枚举 set。 |
示例
import java.util.EnumSet; public class EnumTest { public static void main(String[] args) { EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class); points.add(AlarmPoints.BATHROOM); System.out.println(points); points.addAll(EnumSet.of(AlarmPoints.START1,AlarmPoints.START2,AlarmPoints.KITCHEN)); System.out.println(points); points = EnumSet.allOf(AlarmPoints.class); System.out.println(points); points.removeAll(EnumSet.of(AlarmPoints.START1,AlarmPoints.START2,AlarmPoints.KITCHEN)); System.out.println(points); points.removeAll(EnumSet.range(AlarmPoints.OFFICE1, AlarmPoints.OFFICE4)); System.out.println(points); points = EnumSet.complementOf(points); System.out.println(points); } } enum AlarmPoints{ START1,START2,LOBBY,OFFICE1,OFFICE2,OFFICE3,OFFICE4,BATHROOM,UTILITY,KITCHEN }
输出:
[BATHROOM] [START1, START2, BATHROOM, KITCHEN] [START1, START2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN] [LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY] [LOBBY, BATHROOM, UTILITY] [START1, START2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN]