为什么我必须为类的每个成员调用/初始化hashCode()方法?

时间:2017-01-17 14:15:37

标签: java collections hashcode

我注意到在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;
}

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

2 个答案:

答案 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}}表示,以便以某种方式将其值添加到结果哈希码中。多亏了这个,具有相同StringhashCode()的2个对象的实例不一定具有相同的哈希码,获得哈希冲突的风险是有限的,这是我们所期望的。