【问题标题】:Implementation of Hashcode for custom class in Java [duplicate]Java中自定义类的Hashcode的实现[重复]
【发布时间】:2013-01-16 21:01:40
【问题描述】:

可能重复:
Overriding equals and hashCode in Java

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

名字

我应该实现 equals 和 hashcode,这样两个具有 firstnamelastname 的人应该为 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的实现是否正确?即使我得到了预期的结果,我想知道这个实现是否正确?

【问题讨论】:

  • 如果 firstname 或 lastname 为 null,您的代码将不起作用
  • 另外,只有当 firstname 和 lastname 相等且不为 null 时,equals 方法才返回 true。
  • 在hashCode方面,我们会说它的好坏,而不是正确或错误。好的 hashCode() 意味着 hashmap 中发生冲突的可能性较小。

标签: java hashcode


【解决方案1】:

对正确的equalshashCode 实现here 进行了精彩的讨论:

只要 a.equals(b),则 a.hashCode() 必须与 b.hashCode() 相同

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 只有person对象才能调用这个方法对吧?
    • 方法的参数可能不是人。想象一下如果有人执行 new Person().equals("My string"); 会发生什么
    • 明白了,非常感谢!!,我早该想到的。
    • (null instanceof Person) 始终为 false,并且 (obj instanceof Person)==false 与 !(obj instanceof Person) 相同。因此,您的代码可以简化为: if (!(obj instanceof Person)) return false;
    • @Tobias 或简单的return (obj instanceof Person && this.hashCode() == obj.hashCode());
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 两个Strings 具有良好的散列函数这一事实并不能保证两个散列值的总和分布良好(按位考虑)
      • 实际上 2 个 2 个字符的字符串应该以这种方式具有与 1 个 4 个字符的字符串一样好的分布。除了两个字符串相等的情况。
      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多