gpt4 book ai didi

java - 如何在 Java 中计算枚举的哈希码,以及如何将枚举哈希码组合为 HashMap 的键

转载 作者:太空狗 更新时间:2023-10-29 22:40:45 25 4
gpt4 key购买 nike

我有一个包含不同枚举(不同类型)的类。此类用作 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();
}

假设此委托(delegate)给 Object.hashCode(),一切都应该没问题,因为对于每个枚举常量,只存在一个实例,而 Object.hashCode() 将在theory 类似于从对象的内部地址派生的整数。我说得对吗?

PS:当然,当在一个键中多次使用相同的枚举时,您将不得不使用更复杂的东西。

最佳答案

是的,你是对的,枚举元素的哈希码将来自静态实例,绑定(bind)到内存位置,并且是唯一的。

另一方面,有更好的方法可以生成冲突概率较小的哈希码。例如,查看 eclipse 可以为您自动生成的默认值(右键单击,Source> Generate hashCode and equals)

public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((enum1 == null) ? 0 : enum1.hashCode());
result = prime * result + ((enum2 == null) ? 0 : enum2.hashCode());
return result;
}

通过将素数混入其中(我忘记了精确的数学运算),您应该会更抗拒一些。

请注意,您还可以让 eclipse 为您生成一个 equals 方法! (甚至是 toString)。并不是说您必须盲目信任它们,但它们通常是一个很好的开始。

关于java - 如何在 Java 中计算枚举的哈希码,以及如何将枚举哈希码组合为 HashMap 的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13581409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com