ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

软件构造笔记(十二)---PPT第八讲

2021-07-02 17:30:11  阅读:152  来源: 互联网

标签:对象 equals 等价 hashCode --- 笔记 PPT 重写 引用


ADT和OOP中的等价性

前言

等价性的划分:
不可变对象的引用等价性==和对象等价性equals()
可变对象的观察等价性和行为等价性

引用等价性

== 操作符比较引用。
它测试引用相等。两个引用是 == 如果它们指向内存中的相同存储。在快照图中,如果两个引用的箭头指向同一个对象气泡,则它们为==。
== 对基本数据类型,使用== 判定相等

对象等价性

equals()函数

equals()操作比较对象内容——换句话说,对象相等。
对对象类型,使用equals()

正常的equals()方法:在Object 中实现的缺省equals() 是在判断引用等价性,所以应该重写equals()方法
在这里插入图片描述
错误重写:这是Overload,不是重写
在这里插入图片描述
正确重写:
在这里插入图片描述
一个更好的方法去实现equals()
在这里插入图片描述

hashcode()函数

等价的对象必须有相同的hashCode
根据上面描述的Duration类,在修改equals()函数之后,d1.equals(d2)=true,但是输出hashCode()的值发现两者的哈希值不同
在这里插入图片描述
修改方法:为对象的每个组件计算一个散列代码,用于确定是否相等(通常通过调用每个组件的hashCode方法),然后组合这些散列代码,并进行一些算术操作。
对于Duration,这很容易,因为类的抽象值已经是一个整数值:
在这里插入图片描述

观察等价性

当不能通过不改变对象状态的观察来区分它们时,也就是说,只调用observer、producer和creator方法。这通常被严格地称为观察等价性,因为它测试两个对象在程序的当前状态下是否“看起来”相同。
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致
对可变类型来说,往往倾向于实现严格的观察等价性

实现观察等价性的缺陷:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210702171044536.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ3NDExODc4,size_16,color_FFFFFF,t_70

行为等价性

当它们不能通过任何观察来区分时,甚至状态也会改变。这种解释允许调用两个对象上的任何方法,包括mutators。这被称为行为平等,因为它测试两个物体在当前状态和所有未来状态下是否会“表现”相同。
行为等价性:调用对象的任何方法都展示出一致的结果

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

总结

1.对于不可变对象:
equals()应该比较抽象值。这就相当于说equals()应该提供行为平等。
hashCode()应该将抽象值映射为整数。
所以,不可变类型必须重写equals()和hashcode()函数
2.对于可变对象:
equals()应该比较引用,就像==一样。同样,这就相当于说equals()应该提供行为平等。
hashCode()应该将引用映射为一个整数。
所以,可变类型不需要重写equals()和hashcode()函数

标签:对象,equals,等价,hashCode,---,笔记,PPT,重写,引用
来源: https://blog.csdn.net/m0_47411878/article/details/118418522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有