第三章--第五节:在ADT和OOP中的“相等”

第三章:抽象数据类型(ADT)和面向对象编程(OOP)

第五节:在ADT和OOP中的“相等”


问题一:三种方式来看待“相等”

  1.     使用AF来看待“相等”:AF映射到同样的结果,则等价(a equals b if and only if f(a)=f(b))
  2.      使用一个等价关系来看待“相等”:等价关系:自反、对称、传递(与第一种方式是等效的)
  3.     站在外部观察者角度来看待“相等”:如果他们不能被抽象数据类型的一系列方法来被区分,则说他们是“相等的”

:(通过以observation来确定等价性)判断下流对象是否等价



(因为此函数的方法只是判断分钟转化为秒并加上秒的数值是否相等即可判断两个对象是否相等。所以d1、d3、d4都是“相等的”)

问题二:比较“==”和“equals()”

    “==”:表示引用等价性(比较在内存中的地址)

    “equals()”:表示对象等价性(比较对象的内容)(在自定义ADT时,需要重写Object的equals())

  • 对基本数据类型,使用“==”判定相等(原因:基本数据类型的数据 只有值 没有ID,即相同的值的变量都指向同一块内存空间)
  • 对对象数据类型,使用equals()判定
  • 如果如果用==,是在判断两个对象身份标识 ID是否相等(指向内存里的同一段空间)

问题三:immutable数据类型的“相等”

  • 在Object中实现的缺省equals()是在判断引用等价性,这通常不是程序员所期望的。因此,需要重写

:判断下列表示的“相等”



(注意:这里的equals()方法不是重写Object的方法,而是overload。因为在重载的equals的方法中只是返回长度,并且d2是Duration类型的,与Duration类中的equals方法的参数类型相匹配,所以第一个返回true。然而o2是Object类型的不与Duration类中的equals方法的参数类型相匹配,所以调用的是Object中的equals()方法,比较引用,所以返回false)

也可以重写 equals()方法:↓↓↓


(用instanceof函数判断是不是某个类的实例)(注意instanceof是动态检查,不是静态检查)

问题四:Object的合约

    hashcode的合约:如果两个对象根据Object的方法equals来判断是相等的,那么根据两个对象的hashcode的方法必须产生相同的Interger的返回值结果。(两个equal的objects,一定要有同样的hashcode.)

    一般的规则:当你重写了equals()时,总是一定要重写hashcode()。

:下面这段代码需要怎么重写hashcode()函数

    


解:因为equals()函数,仅有当两个Person的lastName相等时,才返回true;所以需要当返回true时,两个对象的hashcode()函数返回结果相同。所以,只有第一个和第三个满足要求(但第一个全部映射到一个数,虽然满足要求,但效率太低)

问题五:mutable数据类型的“相等”

    对于可变数据类型来说的“相等”:

  1.     观察等价性:在不改变状态的情况下(by calling only observer, producer, and creator methods),两个mutable对象是否看起来一致
  2.     行为等价性:调用对象的任何方法(可以调用mutator)都展示出一致的结果
  •     对于不可变的对象,观察等价性和行为等价性是一样的,因为他们没有任何的mutator的方法
  • 对可变类型来说,往往倾向于实现严格的观察等价性

(但有些时候,观察等价性可能导致bug,甚至可能破坏RI)

**:假设我们创建了一个List,并把它放进一个Set


我们能检测出这个set是包含这个List的:


现在我们修改List,我们发现这个List就不在Set中了:


更糟糕的是:当我们用迭代器迭代时发现List任然在Set中,但用函数contains却说它不在了。

    *解析:因为List是可变的对象,在标准的java实现类collection类中的List,可变性影响着equals()和hashcode()的结果;当你将List放入Hashset后,它就被存放在哈希桶/散列桶中,并对应着hashcode()的结果;当List被改变后,它的hashcode()也被改变了,但是Hashset并没有意识到它应该移动到一个不同的桶中,所以它再也找不到了;当equals()和hashcode()函数会被mutation(变值器)影响时,我们可以打破哈希表的RI适用对象作为一个key。    

  • 对于Collections类使用的是观察等价性,但是对于其他的可变类(如StringBuilder)使用的是行为等价类

问题六:关于immutable和mutable的等价性的对比

  • 对可变类型,实现行为等价性即可
  • 也就是说,只有指向同样内存空间的objects,才是相等的
  • 所以对可变类型来说,无需重写这两个函数,直接继承Object对象的两个方法即可
  • 如果一定要判断两个可变对象看起来是否一致,最好定义一个新的方法
  1. 对于不可变的数据类型:equeals应该比较抽象值,也就是应该提供行为等价性;hashcode()应该匹配这个抽象值到一个integer。所以必须重写equeals()和hashcode()函数
  2. 对于可变的数据类型:equals经过该比较引用相当于“==”。说明也应该提供行为等价性;hashcode()应该匹配这个抽象值到一个integer。所以可变数据类型不应该重写equeals()和hashcode()函数。

:看下列按不同要求的等价性是否满足(注意所给数据类型为mutable)




(false;true;false;false;false;true)(行为等价性就要比较地址是否相同)


(false;true;true;false;true;true)(观察等价性:仅仅看内容是否一样)

**:看原始数据类型和包装后的数据类型的区别




解:(一定要注意原始数据类型和包装数据类型(对象数据类型)的区别:基本数据类型的数据 只有值 没有ID,即相同的值的变量都指向同一块内存空间;而对象数据类型有值也有ID)

**例:what do we get out of the map?



false;

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: synaptics.exe 是 Synaptics 触摸板驱动程序的执行文件。当您的电脑上的 synaptics.exe 文件损坏时,可能会导致一些问题。 损坏的映像 x g:d\adt-bundle-windows-x86_ 64-20140702\eclipse\ 是指在该路径下的映像文件有损坏。这可能会导致无法正常启动该程序或功能异常。 要解决这个问题,您可以尝试以下几个步骤: 1. 重新安装 Synaptics 触摸板驱动程序:您可以从 Synaptics 官方网站或您电脑制造商的支持网站下载最新的驱动程序,并按照指示安装。 2. 修复损坏的映像文件:您可以尝试重新下载该文件,并确保下载完整和正确。如果您已经有备份,请还原替换损坏的文件。 3. 执行系统文件检查:您可以运行命令提示符或 PowerShell 作为管理员,然后输入" sfc /scannow",以检查并修复系统文件的损坏。 4. 更新操作系统:确保您的操作系统和所有驱动程序都是最新版本。有时旧版本的操作系统或驱动程序可能与新版本的软件不兼容。 如果以上步骤都无法解决问题,您可以联系 Synaptics 支持或找到专业的计算机技术人员寻求帮助。他们可能需要进一步检查您的系统并提供适当的解决方案。 ### 回答2: synaptics.exe是一个Synaptics触摸板的驱动程序文件。这个文件通常位于计算机的系统文件夹,并用于控制和管理电脑上的触摸板功能。当出现"损坏的映像"错误时,意味着synaptics.exe文件已经受损或缺失,无法正常工作。 x g:d\adt-bundle-windows-x86_ 64-20140702\eclipse\表示的是synaptics.exe损坏的映像所在的路径。这个路径可能是指synaptics.exe文件的位置,其g是一个驱动器,d是目录名,adt-bundle-windows-x86_64-20140702是文件夹的子文件夹,eclipse是另一个子文件夹。 要解决synaptics.exe损坏的映像错误,可以尝试以下步骤: 1. 重新启动计算机:有时,重启计算机可以解决临时的系统错误问题。 2. 更新或重新安装驱动程序:去Synaptics官方网站下载最新的驱动程序,并按照说明进行安装。如果已经安装了最新驱动程序,可以尝试重新安装以修复任何损坏的文件。 3. 运行系统文件检查器:在命令提示符下,输入sfc /scannow命令,系统文件检查器将扫描并修复任何损坏的系统文件。 4. 手动替换文件:如果有备份的synaptics.exe文件,可以手动将其复制到正确的位置。 如果以上步骤都无法解决问题,可能需要联系计算机制造商或专业技术支持以获取进一步的帮助和解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值