可以通过指定定义的枚举来创建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的需求是什么?

提前致谢。

最佳答案

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

该文档对此非常清楚:


  枚举集在内部表示为位向量。这种表示非常紧凑和高效。此类的时空性能应足够好,可以用作传统的基于int的“位标志”的高质量,类型安全的替代方法。如果批量操作(例如containsAllretainAll)的参数也是一个枚举集,它们也应该非常快速地运行。
  
  [...]
  
  不允许使用null元素。尝试插入null元素将抛出NullPointerException。尝试测试是否存在null元素或删除一个元素将正常运行。
  
  [...]
  
  实施注意事项:所有基本操作均按固定时间执行。它们可能(尽管不能保证)比其HashSet同行要快得多。如果批量操作的参数也是一个枚举集,则即使批量操作也会在恒定时间内执行。
  
  java.util.EnumSet, JDK 11

关于java - 对EnumSet/EnumMap的需求超过了通用Set/Map,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53224310/

10-09 01:19