一、等价关系
等价关系:自反、对称、传递
二、Equality of Immutable Types
1、用AF判断
在A空间看相等,而不在R空间。若映射到A中值相等,则等价。
2、站在外部观察者角度判断
对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的。反之亦然!
若无操作则直接相等。
三、== vs. equals()
1、==
referential equality(引用等价性)
== 对基本数据类型,使用==判定相等。
如果用==,是在判断两个对象身份标识 ID是否相等(指向内存里的同一段空间)
2、equals()
object equality(对象等价性)。在自定义ADT时,需要重写Object的equals()
对对象类型,使用equals()
若equal()重写,则Hashcode()必须重写(必须保证相同的对象有相同的Hashcode,不同的对象无所谓)
四、mutable等价性
对immutable来说,观察等价性和行为等价性一样。
对mutable来说,观察等价性和行为等价性不一样,行为等价性要更严,因为其要求指向同一个对象且任意时间点都一样。总而言之,对mutable尽量实现行为等价性。
Object的equal()方法是行为等价性,所以对mutable类直接继承Object的equal()就好。
Object的clone()是浅拷贝,只对属性的类型进行拷贝,值没有拷贝(仍指向同一对象)。