7

可能重复:
在 Java 中覆盖 equals 和 hashCode

我应该为自定义类 Person 实现 hashcode 和 equals。人由

我应该实现equals和hashcode,这样两个名字和姓氏的人应该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的实现在这里正确吗?即使我得到了预期的结果,我想知道这个实现是否正确?

4

4 回答 4

8

您的 equals 方法有一个小问题,因为如果 obj 为 null 或不是 a ,它将引发异常Person,因此您应该在 equals 的顶部添加以下内容:

if(obj==null || !(obj instanceof Person))
   return false;
于 2013-02-01T14:19:15.730 回答
4

这里有一个关于正确equalshashCode实施的精彩讨论:

每当 a.equals(b) 时,a.hashCode() 必须与 b.hashCode() 相同

这是唯一重要的规则。除了这条规则之外,没有正确的实现。在性能和哈希冲突方面hashCode更好更差的哈希码,但这完全是另一个话题。

根据该规则,您的代码似乎是正确的,因为 if a.equals(b), thenfirstname.hashCode()+lastname.hashCode()应该是相同的值ab

于 2013-02-01T14:16:25.927 回答
1

你的代码很好。String 有一个很好的哈希算法,添加哈希是在 Java 中对多个字符串进行哈希处理的最有效方法。

于 2013-02-01T14:20:40.417 回答
0

hashCode()在它可以工作的意义上是正确的(假设字符串 firstname 和 lastname 不为空) - 即该方法将返回一个int. 这是否是一个好的解决方案是一个更长的故事,我相信您可以使用上面的搜索字段进行检查;)

这是我不久前就自定义实现提出的一个有趣的问题hashCode()Using a large prime as a multiplier when overriding hashCode()

于 2013-02-01T14:20:24.460 回答