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

Eclipse自动生成的哈希代码覆盖

宰父子安
2023-03-14

我使用eclipse生成Object的hashCode和equals方法的覆盖,并生成了一些关于hashCode覆盖的问题。下面的hashCode()是否正确?

问题:

-为什么eclipse会生成两行代码?我认为将两个结果相加是合适的。知道为什么它们是分开的任务吗?

-最终的int素数可以是任何素数吗?

-整数结果是否应始终为 1?

public class Overrider {
    private Long id;
    private String name;
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Overrider other = (Overrider) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}

共有3个答案

仉运乾
2023-03-14

-为什么eclipse会生成两行代码?我认为将两个结果相加是合适的。知道为什么它们是分开的任务吗?

请记住,这是在 eclipse 中运行以生成代码的代码。因此,有一个特定的逻辑。每个变量生成一行比为所有变量生成一行要容易得多。

此外,它使代码更具可读性...你能想象把这两种说法合二为一吗?

return prime * (prime + ((id == null) ? 0 : id.hashCode()) ) + 
((name == null) ? 0 : name.hashCode());

我不会费心去简化它,但是如果有10个类变量的话,它会变得很大很可怕...

“最后的int质数可以是任何质数吗?”

看看:为什么String中的Java的hashCode()使用31作为乘数?我从那里引用,它引用了《有效Java》一书…

根据约书亚·布洛赫的《有效Java》(这本书怎么推荐都不为过,多亏了对堆栈溢出的不断提及,我才买的):

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

郭鸿信
2023-03-14

-为什么eclipse会生成两行result=代码?我认为将这两个结果相加是合适的。你知道为什么他们是分开的任务吗?回答:上面定义了固定质数“final int prime=31;”。假设以下情况

id.hashcode()=1

id.hashcode()=2

哈希码应该尽可能唯一,以获得更好的性能。添加结果后,可能会有两个不同的对象返回相同的哈希代码。而使用乘法时,对于不同的对象,有重复哈希码的机会很小。

-最后的int prime可以是任意素数吗?它可以是任何数字,但它确保不同对象的重复hashcodes非常少。例如,上面的31表示即使两个不同对象的id.hashcodess相差1,也将确保这两个对象的实际hashcode相差至少31。S

-int结果应该总是1吗?它可以是任何东西。只是它应该是非零的,并且应该避免计算的复杂性,以使其快速工作。

阎咏思
2023-03-14

在我看来很好。

"为什么eclipse会生成两行结果=代码?"

我猜原因是易读性。看起来你是在再次将第一个结果第二个字段的哈希乘以素数,而不仅仅是将两行相加。生成的代码看起来比:

result = (prime * result + ((id == null) ? 0 : id.hashCode())) + 
         (prime * (prime * result + ((id == null) ? 0 : id.hashCode())) + 
         ((name == null) ? 0 : name.hashCode())); 

“最后的int质数可以是任何质数吗?”

是的,但越高越好。数字越大,发生冲突的可能性就越小。在大多数情况下,31个应该绰绰有余。

"int结果应该总是1吗?"

假设您的意思是“应始终将int结果初始化为1”:

不,它只需要一个不是0的常数。

 类似资料:
  • 我正在写一个Django应用程序,需要与现有的Java播放框架应用程序一起工作。Play应用程序使用PasswordHash.java来存储密码。它以冒号分隔的格式存储密码。每个哈希都存储为::。 例如,下面是密码“测试”的条目: 在这里,我们可以通过拆分字符串并找到: 迭代次数: 盐: PBKDF2哈希:。 我修改了Django的check_密码机制以与此格式兼容,但发现它认为密码不正确。我用了

  • 问题内容: 我希望Eclipse在编写一些变量/类名或关键字时(例如在Flash Develop或Visual Studio中)自动向我建议所有可能的选项。 可能吗? 如果没有,我可以通过哪个Java IDE获得它? 我专门询问一种在键入时 自动 获得与+ 相同的东西的方法。 问题答案: 您还可以将自动完成设置为在键入时自动打开。 转到> > > 并写在外地。 有关更多详细信息,请参见此问题。

  • 问题内容: 我正在寻找一种基于类中定义的字段为现有Java源代码文件中的新方法自动生成源代码的方法。 本质上,我希望执行以下步骤: 读取并解析 遍历源代码中定义的所有字段 添加源代码方法 保存(理想情况下,保留现有代码的格式) 哪些工具和技术最适合完成此任务? 编辑 我不想在运行时生成代码;我想扩充现有的Java 源代码 问题答案: 用自动生成的代码修改相同的Java源文件是维护的噩梦。考虑生成一

  • 问题内容: 我在Employee类中有以下定义 现在,我想使用现有员工ID导入现有员工。即使在保存之前设置了员工ID,也会忽略分配的ID,并存储自动递增的ID。我们如何覆盖呢? 问题答案: 我编写了自己的生成器来解决此问题。 并像这样使用它:(替换包名)

  • 我通常让Eclipse为我生成hashCode()方法,但是现在我发现有迹象表明生成的哈希代码可能不是很好。 在哈希集中使用由Eclipse生成的hash code()方法返回的哈希代码会导致查找速度比使用手工编码的hashCode()方法慢6倍。 这是我的测试: 具有三个int字段的类。 hashCode()和equals()方法已由Eclipse生成。 用1.000.000个类实例填充Hash

  • 最近,我参加了一次面试,遇到了一个关于哈希碰撞的很好的问题。 问题:给出一个字符串列表,把字谜一起打印出来。 示例: I/P: 、 、 、 、 、 、 、 、 、 、 、 、 {行为,上帝,动物,狗,猫} O/P:               演戏,猫,狗,上帝 我要创建hashmap并将单词作为键,将值作为字母表列表 为了避免冲突,我想为字母表生成唯一的哈希代码,而不是排序并使用排序后的单词作为