【问题标题】:How does the return value works in Hashcode override? [duplicate]返回值如何在 Hashcode 覆盖中工作? [复制]
【发布时间】:2018-09-28 19:39:23
【问题描述】:

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

}

【问题讨论】:

  • 如果你想知道为什么它在一个被修改的变量中而不是一个单独的 return 语句中,试着用两种方式编写它,看看哪个更容易阅读、编写和扩展。
  • 您并没有真的分配很多值。您只是将变量用作临时持有者。你可以写成return 31 * (31 * (31 * 17 + name.hashCode()) + age) + passport.hashCode();但它只是没有那么清楚,修改起来更难等等。
  • 不清楚您对什么感到困惑。样式?逻辑?更加详细一些。而且这种态度是完全没有必要和无益的。

标签: java collections overriding equals hashcode


【解决方案1】:

result 的连续分配是为了“打乱”其中包含的信息,并添加来自其他来源的更多信息。请注意,result 位于分配的两侧。从基值 17 开始,我们会这样做几次:

result = 31 * result + someValue;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2013-06-11
    • 2020-06-06
    • 2018-08-27
    • 2014-04-19
    • 2011-04-24
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多