微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

hashCode() 方法

如何解决hashCode() 方法

我需要一些帮助以从理论上更好地理解 hashCode() 方法。我读过(强调我的):

当对两个单独的对象(根据 hashCode() 方法相等)调用 equals() 时,它返回相同的哈希码值。 但是,如果在两个不相等的对象上调用它,它不一定会返回不同的整数值

哪里会出现异常?

解决方法

public int hashCode() {
  return 27;
}

信不信由你,尽管这不是一种非常有效的工作方式,但它是 hashCode 的有效实现,因为它会尊重与 equals 方法的契约。此实现将导致您所描述的情况。

hashCode 用于限制要比较的案例数量。 例如,如果在一所高中,您正在寻找一名学生。您只知道该学生的姓名、性别和年龄。您是要查看所有学生,还是仅查看具有该年龄和性别的学生?

对于某些数据结构,hashCode 也是如此。在查找项目时,它会首先创建一个具有相同 hashCode 的项目的子列表/集合,然后在该子列表/集合中搜索确切的项目。

您的哈希码越具体,搜索的效率就越高。

,

假设您有一个包含两个 String 字段的类,并且它的哈希码是通过将这两个字段的哈希码相加来计算的。进一步假设您有一个 equals 来简单地检查类字段值是否相等。

class Test {
    String a;
    String b;

    public Test
    
    @Override
    public int hashCode() {
        return a.hashCode() + b.hashCode();
    }


    @Override
    public boolean equals(Object o) { // simplified
         Test other = (Test)o;
         return a.equals(other.a) && b.equals(other.b);
    }
}

让我们看看不相等的实例是否可以具有相同的哈希码

Test t1 = new Test("hello","world");
Test t2 = new Test("world","hello");

System.out.println(t1.equals(t2));                  // false
System.out.println(t1.hashCode() == t2.hashCode()); // true

我们是否仍然尊重hashCode's contract

在 Java 应用程序执行期间,只要在同一个对象上多次调用它,hashCode 方法必须始终返回相同的整数,前提是没有修改对象的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。

嗯,是的,因为它只取决于 ab,而且我们正在使用他们的 hashCode 方法,我们可以假设尊重合同。

如果两个对象根据 equals(Object) 方法相等,则对这两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。

确实如此

Test t1 = new Test("hello","world");
Test t2 = new Test("hello","world");

System.out.println(t1.equals(t2));                  // true
System.out.println(t1.hashCode() == t2.hashCode()); // true

如果两个对象根据 equals(java.lang.Object) 方法不相等,则不需要对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

这就是我们首先要展示的。这不是必需的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。