当前位置: 首页 > 面试题库 >

为什么EnumSet或EnumMap的性能可能比散列的EnumSet或EnumMap更好?

齐昊焱
2023-03-14
问题内容

以下是EnumMap的Java文档的
实现注释”
部分的内容:

实施注意事项:所有基本操作均按固定时间执行。它们可能(尽管不能保证)比其HashMap同行更快。

我在java doc中EnumSet也看到了类似的内容。我想知道为什么它比散列的同行更有可能EnumSets而且EnumMaps会更快?


问题答案:

EnumSet由位数组支持。由于您可以EnumSet预先输入不同项目的数量,因此我们可以简单地为每个枚举值保留一位。您可以想象对Set<Byte>或进行类似的优化Set<Short>,但是对于Set<Integer>(通常需要0.5
GiB的内存来存储2 ^ 32位)或一般而言,这是不可行的。

因此,基本操作就像exists或设置了add恒定时间(就像HashSet),但是它们只需要检查或设置一位。没有hashCode()计算。这就是为什么EnumSet更快。还有更复杂的操作(例如并集)或使用位操作技术轻松实现的操作。

在OpenJDK的有两种实现方式EnumSetRegularEnumSet能够处理多达64个值枚举在longJumboEnumSet更大的枚举(使用long[])。但这只是实现细节。

EnumMap按照类似的原理工作,但是它用于Object[]存储值,而从中隐式地推断了键(索引)Enum.ordinal()



 类似资料:
  • 我最近读了一篇关于的文章。文中写道:“使用EnumMap带来实现特定的好处,这是针对枚举键实现的,简而言之,是专门针对枚举键优化的映射实现。” 它还写到:“枚举是使用数组实现的,常用的操作会产生恒定的时间。因此,如果您想要一个高性能的,可以是枚举数据的合适选择。”

  • 枚举是可比较的,这意味着您可以 它们的访问时间为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

  • 问题内容: 我有以下示例: 在这段代码中,我可以理解Enum创建了一个Enum类型的Sizes。 我的问题是:EnumSet类型的对象吗?到底是什么意思 我真的很想更好地理解它。 问题答案: 对于任何变量,可以在其声明中找到其类型: 是的,(应该命名,因为它是一个集合)是type 。它也应该被泛化,因此被声明为 它的意思是那是type 。一个是一个包含一个特定的枚举类型的枚举例如,在比其他更有效的