需要EnumSet/EnumMap而不是一般化的Set/Map



EnumSet/EnumMap可以通过指定定义的枚举来创建,以生成集合/映射实例,如下示例代码所示。

到目前为止,我读到EnumSet/EnumMap和Set/Map的区别在于,我们不能在EnumSet/EnumMap中添加指定的Enum以外的对象。如果是这样的话,那么仅仅通用的集合/映射本身就足够了,不是吗?

请找到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);
}
}

那么,你能告诉我,尽管我们能够创建生成为定义的枚举的集合/映射,但拥有EnumSet/EnumMap事件的需求是什么吗?

提前谢谢。

接口几乎完全相同。不过,性能和底层机制完全不同。

文档对此非常清楚:

枚举集在内部表示为位向量。这种表示非常紧凑和高效。这个类的空间和时间性能应该足够好,可以作为传统的基于int的"位标志"的高质量、类型安全的替代品使用。即使是批量操作(如containsAllretainAll(,如果它们的参数也是枚举集,也应该运行得很快。

[…]

不允许使用null元素。尝试插入null元素将抛出NullPointerException。然而,尝试测试null元素的存在或移除一个元素将正常工作。

[…]

实现说明:所有基本操作都在恒定时间内执行它们很可能(尽管不能保证(比HashSet的同行快得多如果大容量操作的参数也是枚举集,则即使大容量操作也会在恒定时间内执行。

java.util.EnumSet,JDK 11

相关内容

  • 没有找到相关文章

最新更新