【软件构造】ADT和OOP中的等价性 Equality in ADT and OOP

        本文主要介绍ADT等价性中的==操作符和equals函数。

==和equals对比

        在Java中,定义两个ADT是否相等可以从两个方面进行考虑:引用等价性和对象等价性。

        引用等价性:两个对象指向相同的内存区域

        对象等价性:两个对象的内容在适当的定义下相同

        ==操作符即是判断两个对象是否引用等价,而equals函数便是判断两个对象是否在内容上相等。当我们定义新数据类型时,我们有责任确定数据类型值的对象等于什么,并适当地重写equals()操作。我们需要尽量在代码中使用equals函数而不是==,也就是说,在大多数情况下我们都是希望两个对象内容上相等,而不是苛刻的内存引用地址相同。

       

实现equals()

         在Object中实现的缺省equals()是在判断引用等价性,这通常不是程序员所期望的,因此,需要重写,我们必须覆盖equals()方法,用我们自己的实现来替换它。注意在重写equals方法时要注意它的参数类型是Object,我们最好在上方增加@Override标签来告诉编译器我们要进行重写,从而让编译器帮我们进行检查。
        

        同时,我们可以使用同一个类中的辅助函数帮助我们重写equals,另外我们也需要通过instanceof判断类型。

        在重写完equals函数后,我们要通过等价关系来判断你重写的equals函数是否正确。

        另外,我们要重写hashCode函数,以保证RI。

        上述过程是对应于不可变类型的,对于可变类型我们通过观察等价性和行为等价性,也就是说我们通过观察和行为来判断两个可变对象是否相同,我们更加倾向于使用观察等价性。对于可变类型,我们不需要重写equals和hashCode,一直使用引用等价性即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蠢萌_小二爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值