返回值如何在Hashcode覆盖中工作?

时间:2018-09-28 19:39:24

标签: java collections override equals hashcode

在下面的代码中,被覆盖的方法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;
}

}

1 个答案:

答案 0 :(得分:1)

result的连续分配是“加扰”其中包含的信息,并添加来自其他来源的更多信息。请注意,result位于分配的两侧。从基值17开始,然后执行几次:

result = 31 * result + someValue;

通过将result乘以31,我们将现有值向左移动几位,然后通过向其添加另一个值来添加更多位。

这是为您可以定义的每个User对象提供一个相当唯一哈希码的快速方法。