为什么我必须 call/initialize class 的每个成员的 hashCode() 方法?

Why should I have to call/initialize the hashCode() method for each member of a class?

我在 hashCode() 的示例中注意到,每个人都在 hashCode() 方法定义中使用相同的字段来调用 hashCode()

为什么我必须 call/initialize class 的每个成员的 hashCode() 方法,因为哈希码用于查找对象位置(如果我错了请纠正我)?

那么在hashCode()方法定义里面调用hashCode()的目的是什么

例如:

public int hashCode() {
    final int seed = 37;
    int result = 1;
    result = seed * result + ((name == null) ? 0 : name.hashCode());
    result = seed * result + age;
    result = seed * result + marks;
    return result;
}

这里我们有两个字段 agename。第 4 行 name.hashCode() 的目的是什么。

我认为这个问题的更通用形式已经被问到 -

Best implementation for hashCode method

总结一下你的问题,"name" 是一个 String 对象,"age" 是一个 int 文字。种子值通常是素数。

hashCode 方法被 HashMapHashSet 等集合使用,以快速检索对象的方式分发对象的实例(时间复杂度为 O(1)).您的 hashCode 方法实施得越好,这些集合与对象的实例一起使用时效率就越高。一个实施良好的 hashCode 方法将尽可能地限制哈希冲突的可能性,换句话说,它将限制为 2 个不同对象的实例获取相同哈希码的可能性。

知道了,如果我们从您的 hashCode 的实现中删除第 4 行,那么我们将 all 对象的实例具有相同的 agemarks 将具有 相同的 结果哈希码,无论 name 的值如何,因此发生哈希冲突的可能性很高,正如所解释的那样,这是不需要的多于。

所以因为 hashCode returns 一个 32 位整数和 name 显然是一个 String (至少不是原始类型),我们称hashCode() 以获得 Stringint 表示,以便以某种方式将其值添加到生成的哈希码中。因此,具有相同 agemarks 的 2 个对象实例不一定具有相同的哈希码,哈希冲突的风险是有限的,这正是我们所期望的。