我最近读了一篇关于EnumMap
. 它写道:“使用 EnumMap 带来了为枚举键完成的特定于实现的好处,简而言之,EnumMap
是专门为枚举键优化的 Map 实现。”
它还写道“枚举是使用数组实现的,常见的操作会产生恒定的时间。因此,如果您正在考虑高性能Map
,EnumMap
那么枚举数据可能是不错的选择。”
有人可以指出我是如何完成这些优化的吗?(“操作导致恒定时间”)
我最近读了一篇关于EnumMap
. 它写道:“使用 EnumMap 带来了为枚举键完成的特定于实现的好处,简而言之,EnumMap
是专门为枚举键优化的 Map 实现。”
它还写道“枚举是使用数组实现的,常见的操作会产生恒定的时间。因此,如果您正在考虑高性能Map
,EnumMap
那么枚举数据可能是不错的选择。”
查看 EnumMap的文档:
与枚举类型键一起使用的专门
Map
实现。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表示非常紧凑和高效。枚举映射以其键的自然顺序(声明枚举常量的顺序)维护。这反映在集合视图( 、 和 )返回的迭代
keySet()
器entrySet()
中values()
。
简而言之,anEnumMap
只是一个数组,属于映射值的类型。换句话说,一个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()
) 的工作方式相同。
从源代码中可以看出,anEnumMap
包含一个对象数组,其长度正好是enum
. 对于(例如)put
and get
,值的序数值enum
用作数组索引。这个操作显然需要固定的时间。
AnEnumMap
由一个大小为Enum
.
然后通过Enum.ordinal()
方法 whengetting
或putting
data 访问数组,这需要持续时间。