为什么在Enum中hashCode()引用Object hashCode()实现,而不是ordinal()函数?

时间:2013-03-06 07:53:50

标签: java enums hashcode jls

我一直认为 enum hashCode 指的是Java中的序数,因为序数似乎是 hashCode的完美候选者,但事实证明枚举hashCode 实际上是指默认的 hashCode对象实现。

我理解,这与 JLS 并不矛盾,但这仍然让我感到意外,我想不出为什么会这样做。虽然我猜 JVM ,可能依靠这种方式来提供独特的保证,但这不再适用于64位 JVM

我已经检查过JDK 1.6和最新的JDK 7,这两种情况都是一样的。

有没有人知道原因,是这样做的?

序数用作 hashCode 非常有意义,因为它满足所有需要的凭据,而且从一个JVM启动到另一个JVM启动甚至是一致的,不是必需的,但是很好。

2 个答案:

答案 0 :(得分:6)

想象一下这个琐碎的,完全构成的场景:

interface MediaType {}

enum BookTypes implements MediaType {
    HARDCOVER;
}

enum MagazineTypes implements MediaType {
    MONTHLY;
}

Map<MediaType, MediaItem> itemMap = new HashMap<MediaType, MediaItem>();
itemMap.put(BookTypes.HARDCOVER, new Book());
itemMap.put(MagazineTypes.MONTHLY, new Magazine());

我认为很明显为什么你不想在这个例子中使用序数作为哈希码。

答案 1 :(得分:2)

hashcode和ordinal完全不同。

每个枚举的第一个实例将具有相同的序数值,与哈希码相反。

  

序()             返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量为   指定零序数。

enum BookTypes implements MediaType {
    HARDCOVER;  //ordinal is 0
}

enum MagazineTypes implements MediaType {
    MONTHLY; //ordinal is 0
}