public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable
与枚举类型一起使用的专用 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 的成员。
-
从以下版本开始:
- 1.5 另请参见:
-
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]