Java中的枚举映射是完美的哈希映射吗?
如果哈希函数的哈希键列表是已知的且不可变的,则可以生成一个。Java中的A是已知和不可变元素的列表。因此,应该有可能实现一个完美的散列。目前(1.7)是用Java实现的吗?否。Java中的枚举映射是完美的哈希映射吗?,java,hash,enums,perfect-hash,Java,Hash,Enums,Perfect Hash,如果哈希函数的哈希键列表是已知的且不可变的,则可以生成一个。Java中的A是已知和不可变元素的列表。因此,应该有可能实现一个完美的散列。目前(1.7)是用Java实现的吗?否。EnumMap不使用哈希。它使用enum序数值作为值类型数组的索引 参考: 。(如果此链接断开,请在Google上搜索“java.util.EnumMap source”。) 您命名为“EnumHashMap”的链接实际上指向一个名为“EnumMap”的类,其中不涉及哈希: 枚举映射在内部表示为数组。这种表示非常紧凑和高
EnumMap
不使用哈希。它使用enum
序数值作为值类型数组的索引
参考:
- 。(如果此链接断开,请在Google上搜索“java.util.EnumMap source”。)
出于论证的目的,可以认为枚举值到整数的映射(作为上述数组的索引)是一个哈希函数,是的,它是完美的,因为没有共线。枚举映射不是基于哈希的,而是基于数组的 私有瞬态K[]密钥宇宙; ...
私有临时对象[]VAL
EnumMap
不是任何类型的HashMap
,它在内部使用散列来put
和get
数据。它使用数组
存储
对,其中K
是枚举常量
,并使用序数值
(在声明枚举
中枚举常量
的位置称为序数值)在内部存储put
或get
数据。方法用于获取给定枚举常量的序数值
换句话说,EnumMap
不使用散列,而是使用枚举常量的序数值作为put
或get
在其内部数组中的
对的索引
您可以查看的源代码,以确定是否存在错误 您实际看过EnumMap
的实现吗?您认为它有什么不“完美”之处?@markrottveel否我试图在API文档中找到它。源代码包含在JDK中。@markrottveel是的,编译的类也在那里。;-)@ceving-你还没有看过它们吗?你可以说它确实使用了哈希,哈希是(唯一的)枚举ordinal()
;)从什么时候开始,简单索引数组就是哈希表了?只有当有一个非平凡的哈希函数将枚举值转化为哈希值时,它才是一个哈希表。我不是完全认真的,但在问题中提到的“完美哈希函数”的上下文中,以及您可以将ordinal()
视为完美哈希函数的事实中,因此,将索引数组访问看作哈希表并不是一个很大的飞跃。FWW、<代码>枚举、HASCODE()/<代码>不返回序号。它只调用super.hashcode()
。是的,我想你可以说一个完美的哈希表在你对键进行哈希运算后,其行为就像一个(通常是稀疏的)数组。有趣的是,我不知道这一点。这是否意味着理论上,Enum.hashcode()
可能会发生冲突,而Enum.ordinal()
则不会?是的,我明白了P和我也编辑了我的答案。你可以看到。