Java: map是doubleKey类型,hashCode()如何正确?

Java: Map with doubleKey type, how to make the right hashCode()?

我有一个 MultiKey 对象作为 Map 的键。

Key 由名称(字符串)和 ID(整数)组成。

必须履行以下合同: 如果两个键的名称相同或两个键的 ID 相同,则键必须相同。

我必须如何实现 hashCode() 函数才能不违反此约定?有可能吗?

实现 equals 很容易...我只是说:

if (name.equals(other.name) || id == other.id)
    return true;

但这行不通,因为 hashMap 只使用 hashCode() 并不关心 equals()...

示例:

Map A = [ ("tom",1)=TOMAS, ("eli",2)=ELIAS ]

A.get(new Key("tom",0))    should return TOMAS
A.get(new Key("",1))       should return TOMAS
A.get(new Key("eli",2))    should return ELIAS
...

最坏的情况:总是 return相同的hashCode。 specs 简而言之:- 如果 2 个对象相等,则它们必须具有相同的 hashCode。如果 2 个对象不相等,它们仍然可以具有相同的 hashCode。 hashCode 主要是为了性能。

关于我能看到的唯一方法是为 TreeSet 构建一个集合来缓存键的 hashCode。然后使用遇到的第一个equals值作为当前执行的hashCode值。问题:
一种。如果有很多不同的键,可以使用大量额外的内存。
b. hashCode 值不一定在程序的多次执行中保持一致。
C。如果是多线程,则需要针对缓存的哈希码进行同步。

如果您这样做,可以像往常一样简单地结合名称和 ID 生成 hashCode。