当前位置: 首页 > 知识库问答 >
问题:

在日食中覆盖哈希码() - Java [重复]

鄂慈
2023-03-14

每当我使用eclipse'source'菜单覆盖hashcode()时,它会在类中生成以下代码

final int prime = 31;
int result = 1;
result = prime * result + ((fieldName1== null) ? 0 : fieldName1.hashCode());
result = prime * result + ((fieldName2== null) ? 0 : fieldName2.hashCode());

谁能解释一下为什么它要做所有这些计算(乘法和加法),为什么它不简单地返回

fieldName.hashCode();
or
fieldName2.hashCode();

共有3个答案

羊舌墨一
2023-03-14

为什么不返回简单的fieldName.hashCode();或fieldName2.hashCode()

要理解原因,您还必须检查 equals() 的实现,并了解对 hashCode() 实现的约束。

> < Li > < p > < code > hashCode()实现必须为比较为相等的对象返回相等的值:if < code > x . equals(y) then < code > x . hashCode()= = y . hashCode()。

一个好的哈希码()实现应该很少为不比较为相等的对象返回相同的哈希代码:如果!x.等于(y),那么通常x.hashCode() != y.hashCode()

Eclipse生成的equals()实现同时检查fileName1filename2。如果两个对象中的任何一个不同,该方法将认为它们是不等价的两个对象。

因此,如果< code>fileName1或< code>fileName2不同,相应的良好的< code>hashCode()实现应该产生不同的哈希代码值。

因此,一个对应的良好哈希码()实现应该使用文件名1.哈希码()文件名2.哈希码()

孔安福
2023-03-14

这里对此进行了解释。

基本上,在乘法中使用素数可以更好地分配散列值。然后HashSetHashMap会更好地工作,因为它们根据哈希值进行区分。散列值分布不好会导致许多冲突。

太叔繁
2023-03-14

乘法可以减少碰撞。

请阅读约书亚·布洛赫

选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2等效于移位。使用素数的优点不太清楚,但它是传统的。31的一个很好的属性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i

 类似资料:
  • 我有eclipse中的源代码(java语言)。然后我检查保险范围。我给4作为输入。但我不知道颜色(红、黄、绿)是什么意思。以下是代码(ifElse.java): 那么,声明80%、分支机构50%和术语50%的含义是什么?怎么计算呢?非常感谢。

  • 我使用eclipse生成Object的hashCode和equals方法的覆盖,并生成了一些关于hashCode覆盖的问题。下面的hashCode()是否正确? 问题: -为什么eclipse会生成两行代码?我认为将两个结果相加是合适的。知道为什么它们是分开的任务吗? -最终的int素数可以是任何素数吗? -整数结果是否应始终为 1?

  • 问题内容: 如果未重写hashCode()方法,那么对Java中的任何对象调用hashCode()的结果是什么? 问题答案: 在HotSpot JVM中,默认情况下会在第一次调用时生成未重载或随机数并将其存储在对象标头中。随后的调用或仅从标头中提取此值。默认情况下,它与对象内容或对象位置没有共同点,只有随机数。此行为由HotSpot JVM选项控制,该选项具有以下可能的值: 0:使用全局随机数发生

  • 我有3个实体,学生,年级和班级。代码如下所示。这只是一个示例。 学生班级 学校班级: 等级等级: 所以我检查了hibernate文档中的hashcode和equals,它对于DB中存在的实体工作得非常好。我遇到的问题是,在保存到数据库之前,新的瞬态实体对象。我使用HashSet对学生和班级进行了单独的测试,如果它试图添加相同的对象,集合的大小不会增加。 这里我有一个新的成绩集,准备这个集并保存到数

  • 问题内容: 我对Java有一个小问题。如果我重写该方法,使得: 这将导致所有键具有相同的索引。是将它们放置在地图的链接列表结构中,还是仅包含替换了所有其他键的最后一个键? 问题答案: 假设您没有覆盖始终返回true 的方法,它们将放置在地图的链接列表结构中。不同的键可能具有相同的hashCode,但是如果所有键都具有相同的hashCode,则您的HashMap将成为链接列表,这首先使使用此结构的目

  • 问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。