2

如果散列函数的散列键列表是已知的且不可变的,则可以生成完美的散列函数。Java 中的枚举是已知和不可变元素的列表。因此,应该可以将EnumMap实现为完美的散列。目前(1.7)是用Java完成的吗?

4

4 回答 4

6

EnumMap。不使用散列。它使用enum序数值作为值类型数组的索引。

参考:

于 2013-06-07T09:46:13.963 回答
3

EnumMap不是任何一种HashMap会在内部对数据使用散列的put方法get。它用于在内部Array存储和使用的<K, V>对(在声明中的位置,称为序数值)或数据。 Enum.ordinal方法用于获取给定的.KEnumeration constantordinal valueEnumeration constantEnumputgetordinal valueEnumeration 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 回答