由EnumMap / EnumSet完成的优化

时间:2013-05-19 17:15:57

标签: java collections enums

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

还写了“Enum是使用数组实现的,并且常用操作会在恒定时间内 。所以如果你想到高性能Map,{{1} }可能是枚举数据的不错选择。“

<小时/> 有人能指出我是如何完成这种优化的吗? (“操作结果在恒定时间”)

3 个答案:

答案 0 :(得分:8)

查看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())的工作方式相同。

答案 1 :(得分:2)

正如您在source中看到的那样,EnumMap包含的对象数组的长度与enum中的值的数量完全相同。对于(例如)putgetenum值的序数值用作数组索引。这个操作显然需要一段时间。

答案 2 :(得分:1)

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

然后在gettingputting数据时使用Enum.ordinal()方法访问数组,这需要花费时间。