当前位置: 首页 > 知识库问答 >
问题:

由EnumMap/EnumSet完成的优化

杨研
2023-03-14

我最近读了一篇关于enummap的文章。文中写道:“使用EnumMap带来实现特定的好处,这是针对枚举键实现的,简而言之,EnumMap是专门针对枚举键优化的映射实现。”

它还写到:“枚举是使用数组实现的,常用的操作会产生恒定的时间。因此,如果您想要一个高性能的mapenummap可以是枚举数据的合适选择。”

共有1个答案

范甫
2023-03-14

查看EnumMap的文档:

与枚举类型键一起使用的专用map实现。枚举映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表示极为紧凑和高效。

枚举映射按照其键的自然顺序(枚举常量的声明顺序)进行维护。这反映在集合视图(keyset()entryset()values())返回的迭代器中。

简而言之,enummap只是映射值类型的数组。换句话说,枚举图 将只是一个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())的工作方式与此相同。

 类似资料:
  • 问题内容: 以下是EnumMap的Java文档的 “ 实现注释” 部分的内容: 实施注意事项:所有基本操作均按固定时间执行。它们可能(尽管不能保证)比其HashMap同行更快。 我在java doc中也看到了类似的内容。我想知道为什么它比散列的同行更有可能而且会更快? 问题答案: 由位数组支持。由于您可以预先输入不同项目的数量,因此我们可以简单地为每个枚举值保留一位。您可以想象对或进行类似的优化,

  • 枚举是可比较的,这意味着您可以 它们的访问时间为O(ln N)。 枚举集合具有O(1)访问时间,但不可导航 我想知道枚举集合不可导航(和排序)的原因是什么。我是不是漏掉了什么?

  • 问题内容: 枚举可比,这意味着您可以拥有 这些具有O(ln N)访问时间。 枚举集合具有O(1)访问时间,但不可导航 我想知道是否有一个原因,枚举集合不可导航(和排序)。即我想念什么吗? 问题答案: 我最好的猜测是,可导航性并未被视为枚举集的主要用例。在实现中,没有什么会阻止可导航性。和涵盖了将一组枚举成员的需要与可导航性结合在一起的罕见用例。

  • 我知道“接口”和“抽象类”的区别。但是你能给我提供一个可以通过“接口”而不是通过“抽象类”构建的例子吗,留下了“多重继承”的例子?

  • 主要内容:1 什么是Java EnumSet,2 Java EnumSet的层次结构,3 Java EnumSet的语法,4 Java EnumSet的方法,5 Java EnumSet的例子,6 Java EnumSet的例子:allOf()和noneOf()1 什么是Java EnumSet Java EnumSet类是用于枚举类型的专用Set实现。它继承AbstractSet类并实现Set接口。 2 Java EnumSet的层次结构 下图为EnumSet类的层次结构。 3 Java En

  • 主要内容:1 什么是Java EnumMap,2 Java EnumMap的层次结构,3 Java EnumMap的语法,4 Java EnumMap的构造方法,5 Java EnumMap的方法,6 Java EnumMap的例子1 什么是Java EnumMap Java EnumMap类是用于枚举类型键的专用Map实现。它继承了Enum和AbstractMap类。 2 Java EnumMap的层次结构 下图是EnumMap的层次结构。 3 Java EnumMap的语法 4 Java E