-2

我使用哈希码生成器作为 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为相同的值两次,那么我的哈希码结果将会不同。这是实现中的错误吗?

我知道它正在发生,因为哈希码生成器保持运行总数。但它不应该为同一组值提供相同的哈希吗?

另外,如果我不遵循上述方法,那么我最终将在hashcode我的 pojo 方法中初始化相同的哈希码生成器数千次,如下所示:

...
@Override
public int hashCode() {   
    hashBuilder = new HashBuilder();        
    hashBuilder.append(id);        
    return hashBuilder.toHashCode();
}
...

有没有办法重置这个运行总数,这样每次我hashcode用相同的值调用我都会得到一致的答案?

4

1 回答 1

1

你这样做的方式是id每次调用时都会附加另一个hashCode()。由于append()接受一个值(不是字段名!),因此HashCodeBuilder无法知道您是否附加id了两次,或者您是否有另一个字段具有相同的值。

HashCodeBuilder在本地创建hashCode(). 不要假设它会以显着的方式影响性能,除非您已经对应用程序进行了分析并证明它确实如此(也就是避免过早优化)。

如果您确实想避免HashCodeBuilder在 each 上进行不必要的创建,hashCode()则必须跟踪 setter 中的更改,并在值通过 setter 更改时将其设置hashCodeBuilder为;null然后在hashCode()需要时使用它。然后你必须确保所有字段修改都通过设置器。相当多的工作和很多事情都可能出错,所以如果可能的话,你真的想避免这一切。

于 2016-12-12T11:14:08.137 回答