一.等价性
抽象函数AF:内部表示->抽象表示的映射。
我们可以基于抽象函数AF定义ADT的等价操作。
等价性是我们定义的自反,对称,传递关系。判断对象是否相等。
二.不可变类型的等价性
我们可以利用AF,若AF映射到的抽象值相等,那么我们就认为对象相等。
如果observer函数所提供的值相等那么也能判定相等。
不论哪种方式,我们都可以看出。等价和ADT内部实现无关都是在观察角度说明的等价性。
三.equals()与==
我们称==为引用等价性:判定两个引用是否指向同一个对象。
而equals()为对象等价性:判定两个对象是否等价关系。
equals()方法存在于object类中,因为每个类都有自己的实现,创建一个方法能够判定所有的对象等价性,所以默认实现是实现引用等价性。
四.equals实现注意
函数名
1.尽量使用@Override标注确保函数重写。
2.参数应该为Object
方法体
1.判断是否为空
2.instanceof判断同一类
3.按AF判断:要求自反传递对称,多次equals结果不变,hashcode同
HashCode方法:
重写原则:等价hashcode必须相等,不等价hashcode可以相等。
五.不可变类型等价性
1.观察等价性:Observer,producer,creator行为一致,不要求mutator.
2.行为等价性:所有方法调用结果相同,类似于==
对于不可变类型是一会儿事
可变类型实现行为等价性(不重写)即可,如果必须判断建议换用slimar方法,
六.一些类等价性
Date:观察。List:观察
Stringbuilder行为等价性。
自动包装机制value相同就等价,但有时==也可以用,因为常量池存在。