在Java中实现自定义类的Hashcode

时间:2013-02-01 14:12:07

标签: java hashcode

  

可能重复:
  Overriding equals and hashCode in Java

我应该为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的实现是否正确?即使我得到了预期的结果,我想知道这个实现是否正确?

4 个答案:

答案 0 :(得分:5)

你的equals方法有一个小问题,因为如果obj为null或不是Person,它会抛出异常,所以你应该将以下内容添加到equals的顶部:

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

答案 1 :(得分:4)

对正确的equalshashCode实施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中散列多个字符串的最有效方法。