重写equals方法时遵守通用定
在Effective Java的第3章第10条中,讨了在重写equals方法时需要遵守通用约定。篇学习记录将总结并扩展这个主题,帮助Java程序员理解为何要重写equals方法,并供一些示例代码。
在Java中,equals方法用于较两个对象是否相等。然而,默认实现的equals比较的是两个对象的引用,而不是它的内容。为了实现自定义的相等比较,需要重写equals方法来满足我们的需求。
当我们写equals方法时,必须遵守以下通用约定:
. 对称性(Symmetry):如果x.equals(y)返回,那么y.equals(x)也应该返回true。
2.反性(Reflexivity):对于非null的引用,x.equals(x)应该返回true。
3. 传递(Transitivity):如果x.equals(y)返回true,y.equals)返回true,那么x.equals(z)也应该返回true4. 一致性(Consistency):对于任意为null的引用x和y,在对象没有发生变化情况下多次调用x.equals(y)应该返回的一致。
5. 非空性(Non-nullity):对非null的引用x,x.equals(null)应该返回false为了满足上述约定,我们在重写equals时考虑以下几个方面:
- 使用
instanceof
对象类型,并检查是否相等。 - 比较对象的是否相等。
- 考虑处理null引用的情况4. 考虑继承和多态的情况。
以下是示例代码,演示了一个自定义的Person类如何写equals方法:
public class Person {
private String name private int age;
// 构造方法和其他代码省略 @Override
public boolean equals(Object obj) {
if ( == obj) {
return true;
}
if (obj instanceof) {
Person otherPerson = (Person) obj;
return this.equals(otherPerson.name) && this.age == otherPerson.age;
}
return false;
}
// 其他方法省略
}
``在上述代码中,我们重写了equals方法来比较对象的name和age属性。我们首先检查两个对象引用是否相等,如果是直接返回true。然后我们使用`instanceof`关键字来检查obj是否是类的实例,并将其转换为Person类型。最后我们比较两个Person对象的name和age是否相等。
### 重写equals方法时同时也要重写hashCode方法
在Effective Java的第3章第10条和第11条中,讨了在重写equals方法时同时也要重写hashCode方法。本篇学习记录将总结并扩展这个主题,帮助Java程序员理解为何要同时重写这两个方法,并提供一些示例代码。
在Java中,equals方法用于比较两个对象的相等性,而hashCode方法用于获取对象的哈希码。这两个方法是紧密相关的,按照约定,如果两个对象相等(equals方法返回true),那么它们的哈希码也必须相同。
为了满足这个约定,如果重写了equals方法,就必须同时重写hashCode方法。如果不这样做,就有可能违反通用约定,并导致哈希表等数据结构无法正确工作。
以下是重写equals方法和hashCode方法的示例代码:
```java
public class Person {
private String name;
private int age;
// 构造方法和其他代码省略
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Person) {
Person otherPerson = (Person) obj;
return this.name.equals(otherPerson.name) && this.age == otherPerson.age;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// 其他方法省略
}
在上述代码中,我们重写了equals方法来比较两个Person对象的name和age属性。然后,我们使用Objects类提的静态方法hash来生成hashCode。这个静态方法会根据传入的参数生成一个哈希值,我们可以传递多个参数,以确保结果的唯一性。
通过同时重写equals方法和hashCode方法,我们确保了两个相等的对象具有相同的哈希码。这样,我们就可以正确地将对象存储在哈希表等数据结构中,并能够以最高的性能进行查找和检索操作。
遵守这个原则,我们可以保证equals方法和hashCode方法的一致性,确保正确处理对象的相等性和哈希码。这是一项重要的实践,有助于编写可靠且高质量的Java代码。