重写equals方法时遵守通用约定+同时也要重写hashcode方法

重写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时考虑以下几个方面:

  1. 使用instanceof对象类型,并检查是否相等。
  2. 比较对象的是否相等。
  3. 考虑处理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代码。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值