我有一个MultiKey对象作为Map的键。
密钥由名称(字符串)和ID(整数)组成。
必须履行以下合同:如果两个密钥的名称相同或两个密钥的ID相同,则密钥必须相等。
我必须如何实现hashCode()函数,以便不违反此合同?可能吗?
实现平等很容易...我只是说:
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建立一个集合,以缓存键的hashCodes。然后使用遇到的第一个等于值作为当前执行的hashCode值。问题是:
一。如果有许多不同的键,则可能会使用大量额外的内存。
b。hashCode值在程序的多次执行中不一定是一致的。
C。如果是多线程的,则需要针对缓存的hashCodes进行同步。
如果执行此操作,则可以像以往一样简单地将名称和ID组合在一起生成hashCode。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句