2020.04.03软件构造听课笔记

现实中的每个对象实体都是独特的,所以无法完全相等,但有“独特性”
在人类语言和数学中,“绝对相等”是存在的

等价关系:自反、对称、传递

ADT是对数据的抽象,体现为一组对数据的操作
抽象函数AF:内部表示->抽象表示
基于抽象函数AF定义ADT的等价操作
如果AF映射到同样的结果,则等价

站在外部观察者角度:对两个对象调用任何相同操作,都会得到相同结果,则认为这两个对象是等价的,反之亦然

==:代表引用相等性,判断两个对象的地址空间是否相等
equals()代表对象的等价性

自己定义ADT时,需要根据对“等价”的要求,决定是否重写Object的equals()

对于基本数据类型,使用==来判定相等
对于对象类型,使用equals()判定相等

Object是所有类的父类

instanceof:判断某个对象是不是特定类型(或其子类)
instanceof是动态类型检查,不是静态类型检查
除了用于实现equals()方法,尽可能避免使用instanceof和getClass()

除非对象被修改了,否则多次调用equals()的结果必须一致
x.equals(null)必须为false
“相等”的对象,其hashCode()的结果必须一致

哈希表实现了键-值之间的映射
重写equals时一定要重写hashCode

key被映射为hashcode,对应到数组的index,hashcoce决定了数据被存储到数组的哪个位置
Hashtable的RI中基本要求就是key在slot中的位置有hashcode确定

程序在一次运行中多次调用同一对象的hashCode方法,结果相同
不等的对象也可以映射为同一hashcode,但是性能会变差

两个equal的objects,一定要具有相同的hashcode
除非你能保证你的ADT不会被放入到Hash类型的集合类中

观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致
行为等价性:调用对象的任何方法都展示出一致结果

对可变类型来说,往往倾向于实验严格的观察等价性
但在有些时候,观察等价性可能导致bug,甚至可能破坏RI

对象的hashcode变了,但是HashSet没有更新其在bucket的位置,查找时在新hashcode的位置找不到元素

对可变类型,实现行为等价性即可
也就是说,只有指向同样内存空间的objects,才是相等的
所以对可变类型来说,无需重写这两个函数,直接继承object的两个方法即可
如果一定要判断两个可变对象看起来是否一致,最好定义一个新的方法

可变类型可以不用重写equals和hashcode
不可变类型一定要重写equals和hashcode

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值