【发布时间】:2013-06-02 22:01:15
【问题描述】:
在我最近的问题中,我被告知我需要覆盖我的 equals 和 hashcode 方法(除其他外)。所以我花了一些时间阅读了几篇文章并试图提出一个正确的实现。
以下是我阅读的一些文章:
- Hashcode on Wikipedia
- StackOverflow Overriding equals and hashcode
- StackOverflow Why does hashcode use multiplier 31
所有文章都很好。由于这是我第一次尝试这样做,我只是想确保我没有犯一些简单(或愚蠢)的错误。
我将使用name 来指示我的Person 对象是否等同于另一个Person 对象。原因是所有其他变量都可以变化,但名称始终是唯一的。
已更新以反映建议的更改
public class Person {
private String name;
private int p_number;
private String address;
//other variables
public Person(String a_name) {
name = a_name;
}
public String getName() {
return name;
}
//other getters and setters
@Override
public boolean equals(Object o) {
if(o == null)
return false;
if(o == this)
return true;
if(!(o instanceof Person))
return false;
Person p = (Person) o;
return name.equals(p.name));
}
@Override
public int hashCode() {
return name.hashCode();
}
}
我的问题如下:
- 我是否正确实施了这些方法?
- 由于
name是唯一决定唯一性的变量,我是否需要检查hashcode中的任何其他变量? - 我之前在 StackOverflow 上读到 31 被选为一个好的素数,但现在选择更大的素数更好吗?有人可以确认或否认这一说法吗? (索赔是在上面的第三个链接中提出的)
如果我没有正确实施这些方法,我该如何更改/改进它们?
【问题讨论】:
-
像 Eclipse 这样的 IDE 将为您生成
equals()和hashCode()的良好实现。 -
@GriffeyDog 在我的最后一个问题中,一些帮助 SO'ers 也告诉了我这一点。但是,他们建议我不要生成任何我不理解的东西。
-
@WilliamShatner 这是他们的极好建议!
-
@fge 确实如此!这就是为什么我开始阅读它的原因。我希望能更好地理解这两种方法,因为我的项目很可能会广泛使用它。
标签: java overriding equals hashcode