在Java中实现自定义类的Hashcode

Implementation of Hashcode for custom class in Java

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Overriding equals and hashCode in Java

我应该为自定义类人员实现hashcode和equals。人员包括

firstname

lastname

我应该实现equals和hashcode,这样具有firstname和lastname的两个人应该为equals返回true,并且应该被hashmap接受。我已经实现了这样的个人类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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实现是否正确?即使我得到了预期的结果,我还是想知道这个实现是否正确?


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

1
2
if(obj==null || !(obj instanceof Person))
   return false;


这里有一个关于正确执行equalshashCode的极好讨论:

Whenever a.equals(b), then a.hashCode() must be same as b.hashCode()

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

根据该规则,您的代码似乎是正确的,因为如果a.equals(b),那么firstname.hashCode()+lastname.hashCode()对于ab应该是相同的值。


你的密码没问题。String有一个很好的哈希算法,只是添加哈希是在Java中对多个字符串进行散列的最有效方法。


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

关于hashCode()的自定义实现,我曾经问过一个有趣的问题:在重写hashcode()时使用一个更大的素数作为乘数。