在很多时候,我们需要判断两个对象是否“相等”,那么何为ADT的等价性?==和equals()有何区别?如何为自定义ADT正确实现equals()?接下来,我们就来分析一下这些问题。
等价关系:
由集合论知识,等价关系满足自反、对称、传递。ADT是对数据的抽象,体现为一组对数据的操作;抽象函数AF是从内部表示到外部抽象表示的映射。ADT的等价操作就要基于抽象函数AF,AF映射到同样的结果,则等价;更通俗的说,client观察者对两个对象调用任何相同的操作,都会得到相同结果,则这两个对象等价!
== vs equals():
Java中==是引用等价性,两个对象只有内存地址(身份标识ID)一样才等价,对于基本数据类型,使用==判定相等;
equals()是对象等价性,两个对象内容一样即等价,对于对象数据类型,使用equals()判定相等。
如下图,python二者比较与其他语言正相反:
如何为自定义ADT正确实现equals():
在“祖宗”Object中实现的缺省equals()判断的是引用等价性,如下图:
这通常不是我们所期望的,很多时候我们都是希望判断内容是否等价,因此在自定义ADT中通常需要重写equal(),注意是重写不是重载!!!(重写与重载的区别分析可见上篇博客)因此参数列表不能改变,参数仍为Object类型,这里后续就需要进行强制转换啦~
举个栗子:
重写equals()方法,参数列表不变。先进行类型比较和null值判定,instanceof用来测试左边对象是否是右边的类的实例,即是否是右边类/子类所创建的对象,如果不是类型错误,返回false;接下来进行强制转换,对应上文;最后根据AF来选取Observer方法,对应上文,判断是否等价!