我最近阅读了一篇关于EnumMap
的文章。据说“使用EnumMap为枚举键带来了实现特定的好处,简而言之EnumMap
是针对枚举键的优化Map实现。”
还写了“Enum是使用数组实现的,并且常用操作会在恒定时间内 。所以如果你想到高性能Map
,{{1} }可能是枚举数据的不错选择。“
<小时/> 有人能指出我是如何完成这种优化的吗? (“操作结果在恒定时间”)
答案 0 :(得分:8)
用于枚举类型键的专用
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
中的值的数量完全相同。对于(例如)put
和get
,enum
值的序数值用作数组索引。这个操作显然需要一段时间。
答案 2 :(得分:1)
EnumMap
由大小数组支持Enum
中的值数量。
然后在getting
或putting
数据时使用Enum.ordinal()
方法访问数组,这需要花费时间。