3.5 Equality in ADT and OOP ADT 和OOP 中的”等价性”
1.等价关系
2.不变类型的等价性
3.引用等价性和对象等价性
4.可变数据类型的观察等价性和行为等价性
5.Object契约
6. Autoboxing and Equality
1 Equivalence Relation 等价关系
ADT 是对数据的抽象,体现为一组对数据的操作
抽象函数 AF :内部表示 à 抽象表示
基于抽象函数 AF 定义 ADT 的等价操作
等价关系:自反、对称、传递
2 Equality of Immutable Types 不可变类型的等价性
1)用AF定义等价:AF映射到同样的结果,则等价
2)站在外部观察角度定义等价性
两个类的每一个操作都能得到相同的结果。
3 == vs. equals()
==:引用等价性,对基本数据类型使用==;对对象来说==是判断两个对象的指向的内存空间是否相同。
Equals:对象等价性,对对象应该用equals
利用@Override帮助编译器判断
4 Implementing equals()
在 Object 中实现的缺省 equals() 是在判断引用等价性,这通常不是程序员所期望的,故需要重写
Equals里可以使用instanceof 来进行检查
5.The Object contract Object契约
等价关系:自反、传递、对称
除非对象被修改了,否则调用多次 equals 应同样的结果
“相等”的对象,其 hashCode() 的结果必须一致
不相等的对象要有不一样的hashCode
Always override hashCode() when you override equals().
6 Equality of Mutable Types
观察等价性:在不改变状态的情况下,两个 mutable 对象是否看起来一致
行为等价性:调用对象的任何方法都展示出一致的结果
对可变类型来说,往往倾向于实现严格的观察等价性
但在有些时候,观察等价性可能导致 bug ,甚至可能破坏 RI
List是放在哈希桶里的,如果值变了,哈希值也会改变
如果某个 mutable 的对象包含在集合类中,当其发生改变后,集合类的行为不确定
对可变类型,equals实现行为等价性即可
也就是说,只有指向同样内存空间的 objects,才是相等的。
如果一定要判断两个可变对象看起来是否一致,最好定义一个新的方法。
7 Autoboxing and Equality
但是==就是false
得到false,最好还是用equals