我有一个 MultiKey 对象作为 Map 的键。
key 由名称(字符串)和 ID(整数)组成。
必须履行以下契约(Contract): 如果两个键的名称或 ID 相等,则键必须相等。
我如何实现 hashCode() 函数才能不违反此契约(Contract)?这可能吗?
实现 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
...
最佳答案
我能想到的唯一方法是构建一个 TreeSet 集合来缓存键的 hashCode。然后使用遇到的第一个 equals 值作为当前执行的 hashCode 值。与此相关的问题:
A。如果有许多不同的键,则可能会使用大量额外的内存。
b. hashCode 值在程序的多次执行中不一定保持一致。
C。如果是多线程,则需要针对缓存的 hashCode 进行同步。
如果您这样做,则可以像往常一样简单地结合名称和 id 生成 hashCode。
关于Java:具有doubleKey类型的Map,如何制作正确的hashCode()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773944/