1.可变对象的等价性
可变对象的等价性分为观察等价性和行为等价性。
观察等价性:
在不改变状态的前提下,两个对象是否“看起来”一致。这句话的意思是,如果我们只从用户的角度去观察这两个对象并且不调用改变它们的状态的方法的话(只调用observer、creator、producer类方法而不调用mutator方法),他们之间所展现出的等价性即为观察等价性。
行为等价性:
调用两个对象的任何方法(包括mutator)两个对象都能产生一致的结果。因为它们能产生“一致的行为”,所以被称为行为等价性。
区别:
对于mutable类型,它的观察等价性就是两个对象在某一时刻看起来相等,而行为等价性就是时时刻刻都相等。而对于mutable类来说做到每时每刻都相等只能在两个对象指向同一块物理内存空间的时候才可能发生。
2.不可变对象的等价性
immutable类中的属性一般不允许改变(可以进行有益的改变,即改变前后在用户空间去看发现不了变化),所以immutable类的观察等价性与行为等价性相同。
3.==与equals()
==:
==比较的是引用,也就是说,测试的是引用等价性。如果两个索引指向同一块存储区域,那它们就是==的。
equals():
equals()操作比较对象内容,也就是测试的是对象等价性。
在自定义ADT时,需要重写Object的equals()
用法:
对基本数据类型,使用==判定相等
对对象类型,使用equals()。如果用==,是在判断两个对象身份标识ID是否相等(即是否指向内存里的同一段空间)