ADT和OOP中的等价性
时间:2023-10-18 23:37:01
目录
1.等价关系
2.Immutable等价类型
2.12定义等价性的角度
2.2Java中间,两种操作测试等价性
2.3equals()和hashcode
3.Mutable等价类型
3.1两种等价性
3.2等价性标准
在Java中存在mutable和immutable两种不同的数据类型有不同的等价判断
1.等价关系
等价关系应满足自反、对称和传递的特点
数学定义如下:
①自反性:任意x属于A,x与自己有关R,即xRx
②对称:任意x,y属于A,如果x与y具有关系R,即xRy,则y与x也具有关系R,即yRx
③传递:任意x,y,z属于A,如果xRy且yRz,则xRz
2.Immutable等价类型
2.12定义等价性的角度
①从AF角度,若AF如果映射到相同的结果,则等价
②从观察者的角度来看,对两个对象进行任何相同的操作都会得到相同的结果,认为这两个对象是相等的
2.2Java中间,两种操作测试等价性
①== 引用等价性
如果两个引用指向内存的相同存储器,则相同
②equals() 对象等价性
面向对象,是对两个对象性质的比较
Object中的equals()是引用等价性,所以当我们想使用它时equals()比较两个对象是否等价时,需要重写equals()注意:满足自反、对称、传递三个特点,但没有硬性要求rep每个域的值都是相等的,可以自己定义
2.3equals()和hashcode
假如两个对象equals()结果为true,对应他们hashcode是相同的,但反过来不成立
3.Mutable等价类型
3.1两种等价性
对于mutable就类型而言,我们应该考虑两个对象是否会改变
①观察等价性在某个时刻看起来是平等的
②行为等价性是两个对象一直相等的。
由于mutable类型是可变的,要保证每时每刻都是相等的,这其实是很苛刻的,要保证引用的等价性,只能让两者指向一个内存空间
对于可变类型,往往会实现严格的观察等价性,但观察等价性可能会导致bug,甚至破坏RI,因此,可以实现行为等价性,即指向相同的内存空间,直接继承Object可以,不需要重写equals和hashcode
3.2等价性标准
JDK中,不同mutable使用不同的等价标准-常识