在一个类中重写hashCode()和equals()方法
时间: 2023-07-14 12:13:36 浏览: 108
重写 hashCode() 和 equals() 方法是为了能够正确地比较两个对象是否相等。hashCode() 方法用于计算对象的哈希码,equals() 方法用于比较两个对象是否相等。
在一个类中重写 hashCode() 和 equals() 方法需要注意以下几点:
1. hashCode() 方法必须与 equals() 方法一致。如果两个对象相等,它们的 hashCode() 方法返回的值必须相等。
2. equals() 方法必须满足自反性、对称性、传递性和一致性。即:
- 自反性:任何对象都必须与自身相等。
- 对称性:如果对象 A 与对象 B 相等,那么对象 B 也必须与对象 A 相等。
- 传递性:如果对象 A 与对象 B 相等,对象 B 与对象 C 相等,那么对象 A 也必须与对象 C 相等。
- 一致性:如果对象 A 与对象 B 相等,在对象 A 和对象 B 没有改变的情况下,多次调用 equals() 方法应该返回同样的值。
3. hashCode() 方法的实现应该尽可能均匀地分布对象的哈希码,以减少哈希冲突的概率。
4. hashCode() 方法和 equals() 方法所使用的字段应该是相同的。如果 equals() 方法比较的字段不包括 hashCode() 方法计算的字段,那么两个相等的对象可能会有不同的哈希码。
下面是一个示例代码,演示如何在一个类中重写 hashCode() 和 equals() 方法:
```java
public class Person {
private String name;
private int age;
// 构造方法和 getter/setter 方法省略
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age;
return result;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return Objects.equals(name, other.name) && age == other.age;
}
}
```
在这个示例中,我们使用了 Objects.equals() 方法来比较 name 字段是否相等,它会自动处理 null 值的情况。在 hashCode() 方法中,我们使用了经典的乘法-加法哈希算法,通过将每个字段的哈希码与一个质数相乘,再相加得到最终的哈希码。
阅读全文