-hash的文档说在一个可变对象存储在一个集合中时它不能改变,同样的-isEqual的文档:对于相等的对象,-hash值必须相同.
有鉴于此,任何人都有任何建议,最好的方式来实现 – 哈希,使其满足这两个条件,但实际上是智能计算(即不返回0)?有人知道框架提供的类的可变版本是如何实现的?
最简单的事情当然只是忘记第一个条件(关于它不会改变),只是确保在集合中我不会意外地突破一个对象,但我想知道是否有任何更灵活的解决方案.
编辑:我想知道是否可以维护2个合约(相等的对象具有相等的散列,而当对象在集合中时,哈希不会改变)当我突破对象的内部状态时.我的倾向是说“不”,除非我做一些愚蠢的东西,总是返回0为哈希,但这就是为什么我问这个问题.
解决方法
有趣的问题,但我认为你想要的是逻辑上不可能的.说你从两个对象A和B开始,他们都是不同的,他们从不同的哈希码开始.您添加到一些哈希表.现在,您想要变更A,但是您不能更改哈希码,因为它已经在表中.然而,可以以这样一种方式改变A:等于()B.
在这种情况下,您有2种选择,其中两种都不起作用:
>将A的哈希码更改为等于B.hashcode,这违反了哈希表中不改变哈希码的约束.
>不要更改哈希码,在这种情况下,A.equals(B),但是它们没有相同的哈希码.
在我看来,没有办法可以不使用常量作为哈希码.