【发布时间】:2012-11-14 21:46:34
【问题描述】:
我有一个包含不同枚举(不同类型)的类。此类用作HashMap 的键。目前类 hashCode 是这样实现的:
public static class Key implements Comparable<Key> {
final int a;
final Enum1 enum1;
final Enum2 enum2;
@Override
public int hashCode() {
return a ^ enum1.hashCode() ^ enum2.hashCode();
}
// ... definition of equals and toString ...
}
现在如果枚举 hashCode 只返回枚举定义中枚举值的索引,这将不是最优的(冲突太多)。 Enum.hashCode() 的方法定义是这样的:
/**
* Returns a hash code for this enum constant.
*
* @return a hash code for this enum constant.
*/
public final int hashCode() {
return super.hashCode();
}
假设这个委托给Object.hashCode(),一切都应该没问题,因为对于每个枚举常量只存在一个实例,而Object.hashCode() 理论上将类似于从对象的内部地址派生的整数。我说的对吗?
PS:当然,当同一个枚举在一个键中多次使用时,您将不得不使用更复杂的东西。
【问题讨论】:
-
它不能委托给 Object.hashCode() 以外的任何东西,因为 Enum 扩展了 Object。很难看出这是一个真正的问题。
-
你说对了吗?我相信您可以通过调用
myEnum.ordinal()和myEnum.hashCode()并比较结果来轻松检查自己。
标签: java enums hashmap hashcode