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。
我有一个 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。