为什么我必须 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;
}
这里我们有两个字段 age
和 name
。第 4 行 name.hashCode()
的目的是什么。
我认为这个问题的更通用形式已经被问到 -
Best implementation for hashCode method
总结一下你的问题,"name" 是一个 String 对象,"age" 是一个 int 文字。种子值通常是素数。
hashCode
方法被 HashMap
和 HashSet
等集合使用,以快速检索对象的方式分发对象的实例(时间复杂度为 O(1)
).您的 hashCode
方法实施得越好,这些集合与对象的实例一起使用时效率就越高。一个实施良好的 hashCode
方法将尽可能地限制哈希冲突的可能性,换句话说,它将限制为 2 个不同对象的实例获取相同哈希码的可能性。
知道了,如果我们从您的 hashCode
的实现中删除第 4 行,那么我们将 all 对象的实例具有相同的 age
和 marks
将具有 相同的 结果哈希码,无论 name
的值如何,因此发生哈希冲突的可能性很高,正如所解释的那样,这是不需要的多于。
所以因为 hashCode
returns 一个 32
位整数和 name
显然是一个 String
(至少不是原始类型),我们称hashCode()
以获得 String
的 int
表示,以便以某种方式将其值添加到生成的哈希码中。因此,具有相同 age
和 marks
的 2 个对象实例不一定具有相同的哈希码,哈希冲突的风险是有限的,这正是我们所期望的。
我在 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;
}
这里我们有两个字段 age
和 name
。第 4 行 name.hashCode()
的目的是什么。
我认为这个问题的更通用形式已经被问到 -
Best implementation for hashCode method
总结一下你的问题,"name" 是一个 String 对象,"age" 是一个 int 文字。种子值通常是素数。
hashCode
方法被 HashMap
和 HashSet
等集合使用,以快速检索对象的方式分发对象的实例(时间复杂度为 O(1)
).您的 hashCode
方法实施得越好,这些集合与对象的实例一起使用时效率就越高。一个实施良好的 hashCode
方法将尽可能地限制哈希冲突的可能性,换句话说,它将限制为 2 个不同对象的实例获取相同哈希码的可能性。
知道了,如果我们从您的 hashCode
的实现中删除第 4 行,那么我们将 all 对象的实例具有相同的 age
和 marks
将具有 相同的 结果哈希码,无论 name
的值如何,因此发生哈希冲突的可能性很高,正如所解释的那样,这是不需要的多于。
所以因为 hashCode
returns 一个 32
位整数和 name
显然是一个 String
(至少不是原始类型),我们称hashCode()
以获得 String
的 int
表示,以便以某种方式将其值添加到生成的哈希码中。因此,具有相同 age
和 marks
的 2 个对象实例不一定具有相同的哈希码,哈希冲突的风险是有限的,这正是我们所期望的。