软构:ADT和OOP中的“等价性”

ADT和OOP中的“等价性”

目  录

第1 等价关系

第2 不可变类型的等价性

第3 ==和.equals()

第4 实现equals()

第5 对象契约

第6 可变类的等价关系

第7 自动封装和等价性

  1. 等价关系
  1. 一个等价关系是具有下面这些属性的笛卡尔积:

  1. 对于像==或 equals()这样的布尔值二进制操作,等价性E是该操作返回true的(x、y)的集合。

  1. 不可变类型的等价性
  1. 利用AF定义等价性:AF映射到同样的结果,则等价,例如,a等于b当且仅当f(a)=f(b)
  2. 用观察方法定义等价性:我们谈论抽象值之间平等的另一种方式是外部(客户)能观察到它们的情况。我们可以说,当两个对象不能被观察来区分时,它们是相等的——我们可以应用的每个操作都会对这两个对象产生相同的结果
  1. ==和.equals()
  1. ==引用等价性:它测试参考相等式。如果两个引用指向内存中的同一存储器,则它们是==。如果两个引用的箭头指向同一对象气泡,则为==。对于基本类型,使用==判断相等。
  2. equals()对象等价性:比较对象内容——换句话说,对象相等。对于对象类型,使用equals()。
  3. 必须为每个抽象数据类型适当地定义等于操作,在自定义ADT时,需要重写Object的equals()。如果用==,是在判断两个

  1. 实现equals()
  1. 不是重载,是重写。

  1. instanceof:测试一个对象是否是一个确定类的实例,使用instanceof是一个动态类型检查而不是静态的,一般来说在面向对象编程中使用instanceof是不好的,除了实现等价性之外的任何地方都不应该使用。
  2. 哈希表:哈希表是映射的一种表示形式:将键映射到值的抽象数据类型。它包含一个数组,它被初始化为与我们希望插入的元素数量相对应的大小。当键和值进行插入时,我们计算键的哈希码,并将其转换为数组范围内的索引(如通过模)。然后系统会将该值插入到该索引中。哈希表的rep不变量包含一个基本约束,即键位于由其哈希代码确定的槽中。
  3. 哈希码契约:如果两个对象根据方法相等了,那么他们就必须有相同的HashCode。

不相等的对象,也可以映射为同样的hashCode,但性能会变差。

  1. 对象契约
  1. 等价关系:必须定义一个等价关系,即自反的、对称的和传递的关系,除非对象被修改了,否则调用多次equals应同样的结果,
  2. 非空引用x,x.equals(null)应返回false
  3. hashCode()必须为被相等方法认为相等的两个对象生成相同的结果。
  1. 可变类的等价关系
  1. 观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致。但在有些时候,观察等价性可能导致bug,甚至可能破坏RI。
  2. 行为等价性:调用对象的任何方法都展示出一致的结果。
  3. 对可变类型来说,往往倾向于实现严格的观察等价性。

  1. 自动封装和等价性
  1. 自带封装(对象类型)的类型,如int的Integer,比较时int是==,Integer是equals

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值