本文主要介绍ADT等价性中的==操作符和equals函数。
==和equals对比
在Java中,定义两个ADT是否相等可以从两个方面进行考虑:引用等价性和对象等价性。
引用等价性:两个对象指向相同的内存区域
对象等价性:两个对象的内容在适当的定义下相同
==操作符即是判断两个对象是否引用等价,而equals函数便是判断两个对象是否在内容上相等。当我们定义新数据类型时,我们有责任确定数据类型值的对象等于什么,并适当地重写equals()操作。我们需要尽量在代码中使用equals函数而不是==,也就是说,在大多数情况下我们都是希望两个对象内容上相等,而不是苛刻的内存引用地址相同。
实现equals()
![](https://img-blog.csdnimg.cn/20210707201925269.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudGlib2R5Um9z,size_16,color_FFFFFF,t_70)
同时,我们可以使用同一个类中的辅助函数帮助我们重写equals,另外我们也需要通过instanceof判断类型。
在重写完equals函数后,我们要通过等价关系来判断你重写的equals函数是否正确。
另外,我们要重写hashCode函数,以保证RI。
上述过程是对应于不可变类型的,对于可变类型我们通过观察等价性和行为等价性,也就是说我们通过观察和行为来判断两个可变对象是否相同,我们更加倾向于使用观察等价性。对于可变类型,我们不需要重写equals和hashCode,一直使用引用等价性即可。