在我最近的问题中,我被告知我需要覆盖我的equals
andhashcode
方法(除其他外)。所以我花了一些时间阅读了几篇文章并试图提出一个正确的实现。
以下是我阅读的一些文章:
所有的文章都很好。由于这是我第一次尝试这样做,我只是想确保我没有犯一些简单(或愚蠢)的错误。
我将使用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 不久前被选为一个好的素数,但现在选择一个更大的素数更好吗?有人可以确认或否认这一说法吗?(索赔是在上面的第三个链接中提出的)
如果我没有正确实施这些方法,我该如何更改/改进它们?