在下面的代码中,被覆盖的方法hashCode返回结果。为什么在返回结果变量之前给它分配这么多值?我从一些教程中获得了以下代码:
public class User {
private String name;
private int age;
private String passport;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return user.name.equals(name) &&
user.age == age &&
user.passport.equals(passport);
}
//Idea from effective Java : Item 9
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age;
result = 31 * result + passport.hashCode();
return result;
}
}
答案 0 :(得分:1)
对result
的连续分配是“加扰”其中包含的信息,并添加来自其他来源的更多信息。请注意,result
位于分配的两侧。从基值17开始,然后执行几次:
result = 31 * result + someValue;
通过将result
乘以31,我们将现有值向左移动几位,然后通过向其添加另一个值来添加更多位。
这是为您可以定义的每个User
对象提供一个相当唯一哈希码的快速方法。