【问题标题】:Need of EnumSet / EnumMap over generified Set / MapEnumSet / EnumMap 需要泛化 Set / Map
【发布时间】:2018-11-09 10:52:41
【问题描述】:

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

到目前为止,我读到,EnumSet/EnumMap 与 Set/Map 之间的区别在于,我们不能在 EnumSet/EnumMap 中添加指定的 Enum 以外的对象。 如果是这样的话,那么仅仅泛型化的 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,即使我们能够创建泛型到定义的枚举的集合/映射?

提前致谢。

【问题讨论】:

    标签: java oop enums set enumset


    【解决方案1】:

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

    文档对此非常清楚:

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

    [...]

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

    [...]

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

    java.util.EnumSet, JDK 11

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2023-04-01
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多