我注意到在hashCode()
的示例中,每个人都使用相同的字段在hashCode()
方法定义中调用hashCode()
。
为什么我必须为每个类的成员调用/初始化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()
的目的是什么。
答案 0 :(得分:1)
我认为已经提出了这个问题的更通用形式 -
Best implementation for hashCode method
总结一下你的问题,“name”是一个String对象,“age”是一个int literal。种子值通常是素数。
答案 1 :(得分:1)
hashCode
这样的集合使用HashMap
方法来分发对象的实例,以便快速检索它们(时间复杂度为{{1} }})。实现的HashSet
方法越好,与对象实例一起使用时,这些集合的效率就越高。一个实现良好的O(1)
方法会尽可能地限制获得哈希冲突的可能性,换句话说,它将限制为两个不同对象的实例获取相同哈希码的可能性。
知道如果我们从hashCode
的实施中移除第4行,那么我们就会使用相同的hashCode
和{{全部对象的实例无论hashCode
的值是什么,都会产生相同的结果哈希码,因此获得哈希冲突的概率很高,如上所述,这是不需要的。
因为age
返回marks
位整数,name
显然是hashCode
(至少不是原始类型),我们称之为32
它获取name
的{{1}}表示,以便以某种方式将其值添加到结果哈希码中。多亏了这个,具有相同String
和hashCode()
的2个对象的实例不一定具有相同的哈希码,获得哈希冲突的风险是有限的,这是我们所期望的。