我一直认为 enum hashCode 指的是Java中的序数,因为序数似乎是 hashCode的完美候选者,但事实证明枚举hashCode 实际上是指默认的 hashCode对象实现。
我理解,这与 JLS 并不矛盾,但这仍然让我感到意外,我想不出为什么会这样做。虽然我猜 JVM ,可能依靠这种方式来提供独特的保证,但这不再适用于64位 JVM 。
我已经检查过JDK 1.6和最新的JDK 7,这两种情况都是一样的。
有没有人知道原因,是这样做的?
将序数用作 hashCode 非常有意义,因为它满足所有需要的凭据,而且从一个JVM启动到另一个JVM启动甚至是一致的,不是必需的,但是很好。
答案 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
}