我应该为Custom class Person实现hashcode和equals。人包括
姓名
名字
我应该实现equals和hashcode,这样两个 firstname 和 lastname 的人应该为equals返回true,并且应该被Hashmap接受。我已经实现了这样的Person类:
public class Person {
String firstname;
String lastname;
public Person(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return firstname.hashCode()+lastname.hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Person u=(Person) obj;
return u.firstname.equals(firstname) && u.lastname.equals(lastname);
}
}
这里Hashcode的实现是否正确?即使我得到了预期的结果,我想知道这个实现是否正确?
答案 0 :(得分:5)
你的equals方法有一个小问题,因为如果obj为null或不是Person
,它会抛出异常,所以你应该将以下内容添加到equals的顶部:
if(obj==null || !(obj instanceof Person))
return false;
答案 1 :(得分:4)
对正确的equals
和hashCode
实施here进行了很好的讨论:
每当a.equals(b),则a.hashCode()必须与b.hashCode()相同
这是唯一重要的规则。除了这一条规则之外,hashCode
没有正确的实现。在性能和哈希冲突方面有更好的和更差哈希码,但这是另一个主题。
根据该规则,您的代码似乎是正确的,因为如果a.equals(b)
,那么firstname.hashCode()+lastname.hashCode()
和a
b
应该是相同的值。
答案 2 :(得分:0)
hashCode()
在它可行的意义上是正确的(假设字符串firstname和lastname不为null) - 即该方法将返回int
。是否是一个好的解决方案是一个更长的故事,我相信你可以使用上面的搜索字段检查;)
这是一个有趣的问题,我曾经问过hashCode()
的自定义实现:Using a larger prime as a multiplier when overriding hashCode()
答案 3 :(得分:0)
你的代码很好。 String具有良好的散列算法,只需添加散列是在Java中散列多个字符串的最有效方法。