【问题标题】:Why use EnumMap instead of HashMap为什么使用 EnumMap 而不是 HashMap
【发布时间】:2018-11-21 06:49:53
【问题描述】:

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

【问题讨论】:

  • 您阅读文档了吗?
  • 正如文档所说这种表示非常紧凑和高效。

标签: java hashmap enum-map


【解决方案1】:

Javadoc 提出了一个很好的论点:

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

实现说明:所有基本操作都在恒定时间内执行。它们可能(尽管不能保证)比 HashMap 对应物更快。

【讨论】:

  • 我复制的内容差不多 :) 我建议 OP 查看EnumMap 的源代码,以便查看在预先知道整个“使用空间”时可以采用的快捷方式(因为enums 是不变的。)
  • 也有一些第三方库具有类似的 Map(和其他类型的 Collections)的专门实现,用于约束键或值类型,例如 int,都是为了提高效率。
【解决方案2】:

EnumMap 的主要原因是它专门针对枚举进行了优化。更多好处如下所述。

得到https://javarevisited.blogspot.com/2012/09/difference-between-enummap-and-hashmap-in-java-vs.html#axzz5XTB1xBUe的帮助

1) EnumMap 和 HashMap 的首要区别在于 EnumMap 针对枚举键进行了优化,而 HashMap 是类似于 Hashtable 的通用 Map 实现。您不能使用 Enum 以外的任何类型作为 EnumMap 中的键,但您可以同时使用 Enum 和任何其他对象作为 HashMap 中的键。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2020-05-02
    • 2021-05-06
    • 2020-08-07
    • 2023-01-14
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多