ADT和OOP中的“等价性”
ADT是对数据的抽象, 体现为一组对数据的操作
对于抽象数据类型,抽象函数 (AF)解释了如何将具体表⽰值解释为抽 象类型的值,并且我们看到了抽象函数的选择如何决定如何编写实 现 ADT 的每个操作的代码.
基于抽象函数AF定义ADT的等价操作
如果用AF定义相等的话,AF映射到同样的结果,就等价。
用观察器定义等价:
站在外部观察者⻆度:对两个对象调⽤相同的操作,都会得到相同的结果,则认为两个对象是等价的。反之亦然。
而这里最重要的是==和.equals()的区分
==为引用等价性,而equal()对象等价性
==对基本数据类型,使用==判定相等,对对象类型,使用equal(),
==是在判断两个对象身份标识ID是否相等,默认的Object.equals使用==实现,但应该重写equals()判断是否相等。
哈希表实现了键-值映射,键值对中的key被映射为hashcode,对应到数组的index,hash
code决定了数据被存储到数组的哪个位置。
Hashtable 的RI中基本要求就是key在slot中的位置由hashcode确定。
程序中多次调用同一对象的 hashCode方法,都要返回相同值,同时等价的对象必须有相同的hashCode,但不相等的对象,也可以映射为同样的hashCode,但性能会变差
重写hashCode()
观察等价性与行为等价性:
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致。
行为等价性:调用对象的任何方法都展示出一致的结果。
对可变类型往往倾向用严格的观察等待性,但有可能会导致bug破坏RI