同时重写 hashcode() 和 equals() 法
时间: 2023-09-06 07:02:28 浏览: 79
重写 hashcode() 和 equals() 方法的目的是为了在比较对象时,能够正确地判断它们是否相等。
首先,equals() 方法用于比较两个对象是否相等。一般情况下,我们希望相等的对象拥有相同的属性值。所以,在重写 equals() 方法时,需要注意以下几点:
1. 使用 instanceof 检查对象是否属于同一类,如果不属于同一类,直接返回 false;
2. 将传入的对象转换为当前类的类型,然后逐个比较属性值是否相等;
3. 如果所有属性的值都相等,则返回 true,否则返回 false。
其次,hashcode() 方法用于计算对象的哈希值。在重写 hashcode() 方法时,需要注意以下几点:
1. 如果两个对象相等,那么它们的哈希值必须相等;
2. 如果两个对象不相等,它们的哈希值可以相等,也可以不相等;
3. 通常情况下,我们希望哈希值分布均匀,尽量避免不必要的哈希冲突。
因此,可以使用以下方式重写 hashcode() 和 equals() 方法:
@Override
public int hashCode() {
int result = 17;
result = 31 * result + property1.hashCode();
result = 31 * result + property2.hashCode();
// 继续按照此方式计算其他属性的哈希值
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
MyClass other = (MyClass) obj;
return Objects.equals(this.property1, other.property1) && Objects.equals(this.property2, other.property2);
// 继续按照此方式比较其他属性的值
}
以上代码是一种常见的实现方式,通过将属性的哈希值乘以一个质数 31,并将乘积累加到结果中,可以有效地减少哈希冲突的可能性。同时,使用 Objects.equals() 方法比较属性值,可以避免空指针异常。根据具体情况,你可能需要继续计算其他属性的哈希值和比较逻辑。
阅读全文