【发布时间】:2017-11-04 09:22:04
【问题描述】:
所以,与其每次都计算哈希码,我想我可以保持一个整数更新所有的变化。想象一个用于生成哈希码的属性的设置器:
public void setFoo(Foo newFoo){
this.hashCalculator.remove(this.foo.hashCode()); // remove old hash code
this.hashCalculator.add(newFoo.hashCode()); // add new hash code
this.foo = newFoo; // set new foo
}
(我希望我没有做一些愚蠢的事情)我认为这将是简单的数学运算,但我未能实现它。我认为这与整数溢出有关,但我不确定。显然我错过了一些东西。除法的余数可能应该加回该值,对吧?
这是我的代码。最后结果应该是 1,但这不是我得到的。
class HashCode
{
public int value = 1;
public void add(int val){
// as suggested by effective java
value = value * 37 + val;
}
public void remove(int val){
value = (value - val) / 37;
}
}
HashCode o = new HashCode();
for(int a = 0; a < 1000; a++){
o.add(a);
}
for(int r = 0; r < 1000; r++){
o.remove(r);
}
System.out.println(o.value); // should be 1
【问题讨论】:
-
你是对的,它与整数溢出有关。
-
还有算术。您需要以相反的顺序“删除”您的属性。这很可能是无用的,甚至适得其反的优化。 hashCode 重要的对象无论如何都应该是不可变的,所以它们不应该有 setter。存储他们的 hashCode 会很有用,因为它永远不会改变。
-
有道理,谢谢大家。
标签: java math integer integer-overflow