如果散列函数的散列键列表是已知的且不可变的,则可以生成完美的散列函数。Java 中的枚举是已知和不可变元素的列表。因此,应该可以将EnumMap实现为完美的散列。目前(1.7)是用Java完成的吗?
问问题
558 次
4 回答
6
不 EnumMap
。不使用散列。它使用enum
序数值作为值类型数组的索引。
参考:
- http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/EnumMap.java#EnumMap.getKeyUniverse%28java.lang.Class%29。(如果这个链接断开,谷歌搜索“java.util.EnumMap source”。)
于 2013-06-07T09:46:13.963 回答
3
EnumMap
不是任何一种HashMap
会在内部对数据使用散列的put
方法get
。它用于在内部Array
存储和使用的<K, V>
对(在声明中的位置,称为序数值)或数据。 Enum.ordinal方法用于获取给定的.K
Enumeration constant
ordinal value
Enumeration constant
Enum
put
get
ordinal value
Enumeration constant
换句话说,EnumMap
不使用散列,而是使用序数值Enumeration constant
作为索引put
或内部get
的<K, V>
对array
。
您可以检查EnumMap.put的源代码是否确定!
于 2013-06-07T09:50:23.333 回答
3
您命名为“EnumHashMap”的链接实际上指向一个名为“EnumMap”的类,其中不涉及哈希:
枚举映射在内部表示为数组。这种表示非常紧凑和高效
为了争论,有人可能会争辩说,枚举值到整数的映射(作为上述数组的索引)是一个哈希函数,是的,它是完美的,因为没有冲突。
于 2013-06-07T09:49:09.963 回答
1
EnumMap 不是基于哈希的,它们是基于数组的
私有瞬态 K[] keyUniverse;...私有瞬态对象[] vals;
于 2013-06-07T09:49:28.553 回答