ADT和OOP中的等价性
equal和==
hashcode()和equals()方法总是一起被重写
“==”:引用等价性,指向相同的内存地址,
equals():对象等价性,在自己定义的ADT时,需要重写Object的equals()/
"=="是对基本数据类型,而对于对象类型,使用equals()。
equal的自反、传递、对称
等价的三种定义
1)若AF映射到同样的结果,则等价
2)若两个对象之间满足自反,传递、对称的关系,那么为等价关系
3)站在外部观察者角度发现二者没有区别(对于ADT来说,观察就表示调用该类的运算符)
除非对象被修改了,否则多次调用该对象得到的结果应该时一样的
相等的对象,其hashcode()的结果必须一致
非空:a.equals(null)返回false
hashcode()
重写equal必须重写hashcode,相同的对象一定要有相同的hashcode
可变对象的观察等价性、行为等价性
Object中缺省使用“==”来判断两个对象是否相同
instanceof()操作应该只在equals方法之内使用(不好的操作)
观察等价性:在不改变状态的情况下,两个可变对象是否看起来一致:
1)调用:observer、producer、creater
2)不改变状态
行为等价性:调用对象的任意方法、都展现除一致的结果。
对于可变的对象来说、往往倾向于实现严格的观察等价性,但有些时候,观察等价性可能导致bug,甚至破坏RI
比如:
如果某个mutable的对象包含在Set集合类中,当其发生改变后,集合类的行为不确定性需要小心。
对可变类型,实 现行为等价性即可 。也就是说,只有指 向同样内存空间的objects,才是相等的。 所以对可变类型来说,无需重写这两个函数,直接继承 Object的两个方法即可。 如果一定要判断两个可变 对象看起来是否一致,最好定义一个新的方法。
原文地址:https://www.cnblogs.com/boston-o/p/11074608.html