1

EnumSet/EnumMap可以通过指定定义的枚举来创建 set/map 实例,如下面的示例代码所示。

到目前为止,我读到,EnumSet/EnumMap与 Set/Map 的区别在于我们不能添加EnumEnumSet/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);
    }
}

那么您能否告诉我,EnumSet/EnumMap即使我们能够创建泛化为已定义枚举的集合/映射,有什么需要?

提前致谢。

4

1 回答 1

2

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

文档对此非常清楚:

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

[...]

null元素是不允许的。尝试插入null元素将抛出NullPointerException. 但是,尝试测试null元素是否存在或删除元素将正常运行。

[...]

实施说明:所有基本操作都在恒定时间内执行。他们很可能(虽然不能保证)比他们的同行快得多。HashSet如果参数也是枚举集,即使批量操作也会在恒定时间内执行。

java.util.EnumSet, JDK 11

于 2018-11-09T11:00:29.810 回答