哈工大软件构造复习4(8)
8 Equality in ADT and OOP
ADT和OOP中的等价性
抽象函数AF:内部表示->抽象表示,我们基于抽象函数AF来定义ADT的等价操作,
从数学角度上来说,”绝对相等“存在
相等关系需满足:自反,对称和传递,是一种等价关系
站在外部观察者角度:对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的。
==vs.equals()
其中==表示引用等价性,equals()是对象等价性
如果用==,是在判断两个对象身份标识 ID是否相等(指向内存里的同一段空间)
我们应该总是使用.equal来判断相等

缺省是在判断引用等价性,这不是我们期望看到的,我们需要重写
Java 编译器使用参数的编译时类型在重载操作之间进行选择。(静态类型检查)
检验equals是否正确:
1)每一个对象都等于它本身(自反)
2)如果a.equals(b) 那么 b.equals(a)(对称)
3)if a.equals(b) and b.equals(c), then a.equals(c) (传递)
用instanceof操作可以判断对象是否是一种特殊的类型(用instanceof是一种动态类型检查)(不能在父类中用instanceof判断子类类型)
1)等价的对象必须拥有相同的hashCode;不相等的对象也可以映射为同样的hashCode,但是会影响性能
2)重写equals方法必须要重写hashCode方法(除非能保证你的ADT不会被放入到Hash类型的集合中)
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致
行为等价性:调用对象的任何方法都展示出相同的结果
对mutable类型,实现行为等价性即可。也就是说只有指向同样内存空间的objects,才是相等的,所以对mutable类型来说,无需重写这两个函数,直接调用Object的两个方法即可。
Collections 使用的是观察等价性,但是其他的mutable类(如StringBuilder)使用的是行为等价性
LIST,DATA,观察等价性
clone(a):创建并返回一个a的复制
满足:分配的内存和源对象(即调用clone方法的对象)相同,然后再使用源对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
clone是一个浅拷贝:将内存地址赋给了新变量
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现