Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的枚举映射是完美的哈希映射吗?_Java_Hash_Enums_Perfect Hash - Fatal编程技术网

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”的类,其中不涉及哈希: 枚举映射在内部表示为数组。这种表示非常紧凑和高

如果哈希函数的哈希键列表是已知的且不可变的,则可以生成一个。Java中的A是已知和不可变元素的列表。因此,应该有可能实现一个完美的散列。目前(1.7)是用Java实现的吗?

否。
EnumMap
不使用哈希。它使用
enum
序数值作为值类型数组的索引

参考:

  • 。(如果此链接断开,请在Google上搜索“java.util.EnumMap source”。)
您命名为“EnumHashMap”的链接实际上指向一个名为“EnumMap”的类,其中不涉及哈希:

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


出于论证的目的,可以认为枚举值到整数的映射(作为上述数组的索引)是一个哈希函数,是的,它是完美的,因为没有共线。

枚举映射不是基于哈希的,而是基于数组的

私有瞬态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和我也编辑了我的答案。你可以看到。