【发布时间】:2017-04-27 05:40:59
【问题描述】:
我正在使用哈希码生成器作为 pojo 的实例变量。
public class Pojo {
private HashCodeBuilder hashBuilder = new HashCodeBuilder();
private int i;
public setI(int i) {this.i = i}
@Override
public int hashCode() {
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
}
现在如果我将i 的值设置为相同的值两次,那么我的哈希码结果将会不同。这是实现中的错误吗?
我知道这是因为哈希码生成器保持运行总计。但它不应该为同一组值提供相同的哈希吗?
另外,如果我不遵循上述方法,那么我最终会在我的 pojo 的 hashcode 方法中初始化相同的哈希码生成器数千次,如下所示:
...
@Override
public int hashCode() {
hashBuilder = new HashBuilder();
hashBuilder.append(id);
return hashBuilder.toHashCode();
}
...
有没有办法重置此运行总计,以便每次我使用相同的值集调用 hashcode 时,我都会得到一致的答案?
【问题讨论】:
-
为什么重置比创建新实例更有效?恕我直言,您首先不应该重用它。它甚至会以相同的 id 并连续两次调用
hashCode失败。 -
好吧,你创建了一个 pojo,然后最终调用 hashcode
X次数。您最终会得到X哈希码生成器对象,这些对象可能会被垃圾回收,但您永远不知道何时会发生这种情况。所以在那之前你的内存使用量会增加。所以我认为最好只有一个 pojo? -
不,不是。尤其是对于短命的物体,它们或多或少是免费的。他们被 gc'ed 很快。看起来像是过早的优化,而不是真正的测量。
-
嗯,那么我假设调用它 X 次没有副作用 - 感谢您的澄清
标签: java hashcode apache-commons-lang3