gpt4 book ai didi

java - hashCode() 方法当 equals() 基于多个独立字段时

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:49 26 4
gpt4 key购买 nike

我有一个类,它的相等性基于 2 个字段,这样如果任何一个相等,那么这种类型的对象被认为是相等的。我如何为这样的 equals() 编写 hashCode() 函数,以便保留当 equals 返回 true 时 hashCode 相等的一般约定?

public class MyClass {
int id;
String name;

public boolean equals(Object o) {
if (!(o instanceof MyClass))
return false;
MyClass other = (MyClass) o;
if (other.id == this.id || other.name == this.name)
return true;
return false;
}
}

如何为此类编写 hashCode() 函数?我想避免像这样返回常量的微不足道的情况:

public int hashCode() {
return 1;
}

最佳答案

我认为不存在重要的哈希码。此外,您的 equals() 违反了一般契约(Contract) stated in the API --- 它不可传递:

(1,2) 等于 (1,3)

(4,3) 等于 (1,3)

但是 (4,3) 不等于 (1,2)


为了完整起见,我向您展示 Skeet - Niko证明 =)

声明:哈希码必须是普通常量函数。

证明:令(a,b)(c,d) 是两个具有不同哈希码的对象,即h (a,b) ≠ h(c,d)。考虑对象 (a,d)。根据 OP 的定义,(a,d) 等于 (a,b)(a,d) 等于 (c,d)。它遵循 hashcode contract h(a,d) = h(a,b) = h(c,d);自相矛盾。

关于java - hashCode() 方法当 equals() 基于多个独立字段时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/479105/

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