【发布时间】: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