gpt4 book ai didi

java - 覆盖 hashcode 和 equals 时要考虑的数据成员

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:31 26 4
gpt4 key购买 nike

我知道(契约(Contract))当 equals 被重写时我们需要重写 hashcode。为什么我应该考虑用于等于比较的相同字段来计算哈希码?是否通过避免太多对象映射到同一存储桶来提高性能,如下例所示?即在同一“日期”创建的所有对象将映射到同一存储桶,并且线性比较将花费时间使用 equals() 方法检查对象是否存在?

如果我的上述陈述属实,那么除了性能问题之外,下面的代码还会带来哪些其他潜在问题。这是我们应该使用 equals 中使用的相同字段/成员来计算哈希码的唯一原因吗?请分享。谢谢。

class MyClass {
int date;
int pay;
int id;

public boolean equals(Object o) {
//null and same class instance check
MyClass obj = (MyClass) o;
return (date == obj.date && pay == obj.pay && id == obj.id);
}

public int hashCode() {
int hash = 7;
return (31 * hash + date);
}
}

//请原谅语法错误,我没有使用 ide 输入。

***我的目的是使用 equals 中的所有字段,并知道为什么 hashcode 中应该使用相同数量的元素,以及如果只使用很少的元素会发生什么

澄清:仅使用“日期”来计算哈希码,指针检查正确的存储桶地址(您同意吗?)此外,我获得该存储桶中的项目列表,集合将迭代以使用 equals 检查特定对象是否存在。我对 equals 的定义是“所有字段必须相同”。有了这个,我相信我的代码工作正常,我只发现性能问题。请指出我哪里错了。谢谢

最佳答案

对于您的示例,我建议您仅使用 id 来表示相等,并注释它们是覆盖的。另外,我喜欢重写 toString()

@Override
public boolean equals(Object o) {
if (o instanceof MyClass) {
return (id == ((MyClass) o).id);
}
return false;
}

@Override
public int hashCode() {
return id;
}

@Override
public String toString() {
return String.format("MyClass (id=%d, date=%d, pay=%d)", id, date, pay);
}

这样您就可以更新日期和/或付款而无需重新创建哈希结构。此外,这也是实例的独特之处。

关于java - 覆盖 hashcode 和 equals 时要考虑的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26457750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com