ICode9

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

Equality in ADT and OOP

2021-07-07 18:00:10  阅读:200  来源: 互联网

标签:ADT 相等 Equality 对象 equals 等价 hashCode 判断 OOP


等价性是基于等价关系的,满足自反、对称、传递三个性质,它的空间意义是:如果R中的多个值都对应于A中的同一个值,那么这些R值都应该是等价的。

1. 不可变类型的等价性

判断等价的两个方式:

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

两个等价的对象调用相同的Observer应该返回相同的结果。

等价性
== vs. equals()

  • 引用等价性:使用==判断地址是否相同作为判断是否等价的依据。对基本数据类型,必须使用这种办法判断是否相等。
  • 对象等价性:使用equals()方判断两个对象是否相同法作为判断是否等价的依据,对于对象类型,使用这种办法来判断对象是否等价,如果只用==则是在判断两个对象的ID(内存里的同一空间)是否相等。

equals()和hashCode()
在Object中,equals()的实现为==,而hashCode()的实现为返回内存地址。所以体验极差,需要重写。

重写Object中的equals()方法时要注意参数类型为Object,重写的时候要保持方法参数列表、可见性、返回值必须与父类一致。所以最好使用@Override声明。

equals()方法应该满足下面三个一条件:

  • 等价关系:自反、传递、对称
  • 除非对象被修改了,否则调用多次equals应同样的结果
  • “相等”的对象,其hashCode()的结果必须一致

关于第3点,java在判断两个对象是否相等的时候,先去判断这两个对象的hashCode是否相等,如果不相等,则不会再去调用equals()方法,直接返回false不相等。所以等价的对象必须有相同的hashCode,而不相等的对象,也可以映射为同样的hashCode,但性能会变差。

所以,当实现equals()方法的时候,最好同时实现hashCode()方法,除非你能保证说设计的ADT不会被放入到hash类型的集合中,显然这不太现实。

2. 可变数据类型的等价性

等价性

  • 观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致。调用Observer方法表现出相同的结果。约等于对象等价性。

  • 行为等价性:调用对象的任何方法都展示出一致的结果。包括mutator、producer、observer。约等于引用等价性。

equals()和hashCode()

所以,对可变类型,实现行为等价性即可,也就是说,只有指向同样内存空间的对象才是相等的。所以对可变类型来说,无需重写这两个函数,直接继承Object的equals()和hashCode()即可。

标签:ADT,相等,Equality,对象,equals,等价,hashCode,判断,OOP
来源: https://blog.csdn.net/sbcsn/article/details/118553621

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

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

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

ICode9版权所有