0

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

Key 由 Name (String) 和 ID (int) 组成。

必须完成以下合同:如果两个密钥的名称相等或两个密钥的 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
...
4

2 回答 2

1

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

如果你这样做,hashCode 可以像往常一样简单地结合 name 和 id 生成。

于 2015-02-27T21:11:30.150 回答
0

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

于 2015-02-27T20:52:57.770 回答