return 值在 Hashcode 覆盖中如何工作?
How does the return value works in Hashcode override?
在下面的代码中,覆盖方法 hashCode returns 结果。为什么我们要在返回结果变量之前为其分配这么多值?我从一些教程中得到了以下代码:
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;
}
}
对result
的连续赋值是"scramble"其中包含的信息,并从其他来源添加更多信息。注意 result
在赋值的两边。从基值 17 开始,然后我们这样做几次:
result = 31 * result + someValue;
通过将 result
乘以 31,我们将现有值向左移动几位,然后通过向其添加另一个值来添加更多位。
这是为您可以定义的每个 User
对象提供公平唯一哈希码的非常快速的方法。
在下面的代码中,覆盖方法 hashCode returns 结果。为什么我们要在返回结果变量之前为其分配这么多值?我从一些教程中得到了以下代码:
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;
}
}
对result
的连续赋值是"scramble"其中包含的信息,并从其他来源添加更多信息。注意 result
在赋值的两边。从基值 17 开始,然后我们这样做几次:
result = 31 * result + someValue;
通过将 result
乘以 31,我们将现有值向左移动几位,然后通过向其添加另一个值来添加更多位。
这是为您可以定义的每个 User
对象提供公平唯一哈希码的非常快速的方法。