8

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

我理解,这与JLS并不矛盾,但这仍然让我感到惊讶,我想不出为什么会这样。尽管我猜想JVM可能会以某种方式依靠它来提供唯一的保证,但这对于 64 位JVM不再适用。

我已经检查了 JDK 1.6 和最新的 JDK 7,这两种方法都是一样的。

有人知道为什么,它是这样制作的吗?

将ordinal用作hashCode非常有意义,因为它满足所有所需的凭据,而且它甚至从一个 JVM 开始到另一个 JVM 都是一致的,这不是必需的,但拥有它是件好事。

4

2 回答 2

8

想象一下这个微不足道的、完全虚构的场景:

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());

我认为很清楚为什么在这种情况下您不想使用序数作为哈希码。

于 2013-03-06T08:01:34.287 回答
3

hashcode 和 ordinal 是完全不同的。

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

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

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

enum MagazineTypes implements MediaType {
    MONTHLY; //ordinal is 0
}
于 2013-03-06T07:56:34.560 回答