EnumSet/EnumMap
可以通过指定定义的枚举来创建,以产生set / map实例,如下面的示例代码所示。
到目前为止,我读到的EnumSet/EnumMap
与Set / Map的区别在于,我们不能在Enum
中添加指定的EnumSet/EnumMap
以外的对象。
如果是这种情况,那么仅生成的Set / Map本身就足够了,不是吗?
请按照以下说明找到EnumSet/EnumMap
及其相应的Set/Map
,
enum Value {
VALUE_1, VALUE_2, VALUE_3
};
public class Sample {
public static void main(String args[]) {
EnumSet<Value> enumSet = EnumSet.of(Value.VALUE_1);
Set<Value> enumGenerifiedSet = new HashSet<Value>();
enumGenerifiedSet.add(Value.VALUE_1);
EnumMap<Value, Integer> enumMap = new EnumMap<Value, Integer>(Value.class);
enumMap.put(Value.VALUE_1, 1);
Map<Value, Integer> enumGenerifiedMap = new HashMap<Value, Integer>();
enumGenerifiedMap.put(Value.VALUE_1, 1);
}
}
因此,即使我们能够创建生成为已定义Enum的集合/地图,您能否告诉我EnumSet/EnumMap
有什么需要?
谢谢。
答案 0 :(得分:2)
接口几乎相同。但是,性能和基本机制完全不同。
文档对此非常清楚:
枚举集在内部表示为位向量。这种表示非常紧凑和高效。该类的时空性能应足够好,可以用作传统的基于int的“位标志”的高质量,类型安全的替代方法。如果批量操作(例如
containsAll
和retainAll
)的参数也是一个枚举集,则它们也应该运行得很快。[...]
不允许使用
null
元素。尝试插入null
元素将引发NullPointerException
。尝试测试是否存在null
元素或删除其中一个元素将正常运行。[...]
实施说明:所有基本操作均在固定时间内执行。 它们可能(尽管不能保证)比它们的
HashSet
快得多。即使批量操作的参数也是一个枚举集,它也可以在恒定时间内执行。