为什么使用EnumMap而不是HashMap

33

既然我们已经有了HashMap,为什么还要使用EnumMap


7
你有没有阅读文档? - richflow
11
正如文档所说,“这种表达方式非常紧凑高效。” - Evgeni Enchev
2个回答

29

Javadoc表示:

枚举映射在内部表示为数组。这种表示非常紧凑和高效。

实现备注:所有基本操作均以恒定时间执行。它们可能(但不保证)比其HashMap对应物更快。


基本上就是我在复制的内容 :) 我建议 OP 查看 EnumMap 的源代码,以了解在整个“使用空间”事先已知的情况下可以采取的快捷方式(因为 enum 是常量)。 - jensgram
还有第三方库,提供了类似的Map专门针对int等受限制的键或值类型的特殊实现(以及其他类型的集合),目的都是为了效率。 - Thilo

16
EnumMap的主要原因是它专门针对枚举进行了优化。以下是进一步的好处。
引用自https://javarevisited.blogspot.com/2012/09/difference-between-enummap-and-hashmap-in-java-vs.html#axzz5XTB1xBUe 1)EnumMap和HashMap之间的首要区别是,EnumMap针对枚举键进行了优化,而HashMap是类似于Hashtable的通用Map实现。您不能在EnumMap中使用除Enum以外的任何类型作为键,但可以在HashMap中将Enum和任何其他对象都用作键。
2)EnumMap和HashMap之间的另一个区别是性能。正如前面所讨论的,由于为Enum键进行了专门的优化,当使用枚举作为键对象时,EnumMap可能比HashMap表现更好。
3)HashMap和EnumMap之间的另一个可考虑的差异是碰撞的概率。由于Enum在内部维护为数组,并且使用ordinal()按其自然顺序存储,如下面从EnumMap的put()方法中提取的代码所示。
int index = ((Enum)key).ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接