首页 > 技术文章 > 3.5 Equality in ADT and OOP ADT 和OOP 中的”等价性”

qq1076150459 2020-07-11 20:42 原文

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

推荐阅读