【问题标题】:Optimization done by an EnumMap/EnumSet由 EnumMap/EnumSet 完成的优化
【发布时间】:2013-05-19 17:15:56
【问题描述】:

我最近阅读了一篇关于EnumMap 的文章。 “使用 EnumMap 可以为枚举键带来特定于实现的好处,简而言之,EnumMap 是专门为枚举键优化的 Map 实现。”

还写到“枚举是使用数组实现的,并且常见的操作结果在恒定时间内。因此,如果您正在考虑高性能MapEnumMap 可能是不错的枚举数据的选择。”


有人可以指出我是如何完成这些优化的吗? (“操作结果在恒定时间内”)

【问题讨论】:

  • JDK 是开源的。源代码随 JDK 一起提供。你为什么不读呢?
  • 枚举在内部是 int 值,所以我的猜测是这个 int 值只是用作映射值数组的索引。但正如 JB Nizet 所写,只需自己查看源代码即可。

标签: java collections enums


【解决方案1】:

看着documentation for EnumMap

用于枚举类型键的专用 Map 实现。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表示非常紧凑和高效。

枚举映射按其键的自然顺序(声明枚举常量的顺序)进行维护。这反映在集合视图(keySet()entrySet()values())返回的迭代器中。

简而言之,EnumMap 只是一个数组,属于映射值的类型。换句话说,EnumMap<SomeEnum, SomeValue> 就是SomeValue[]

您可能会问,索引是如何分配的?它们是按枚举的自然顺序分配的。示例:

enum Day {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

上述枚举具有以下自然顺序。

MON TUE WED THU FRI SAT SUN
 0   1   2   3   4   5   6

所以,像map.put(Day.FRI, "Yay!") 这样的操作实际上可以被视为:

array[4] = "Yay!";

数组访问是一个常数时间的操作,这也是EnumMap 的好处所在。查找 (get()) 的工作方式相同。

【讨论】:

    【解决方案2】:

    source 中可以看出,EnumMap 包含一个对象数组,其长度与enum 中的值数量完全相同。对于(例如)putgetenum 值的序数值用作数组索引。这个操作显然需要固定的时间。

    【讨论】:

      【解决方案3】:

      EnumMap 由一个大小为 Enum 中值数量的数组支持。

      gettingputting 数据时,通过Enum.ordinal() 方法访问数组,这需要持续的时间。

      【讨论】:

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