Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。

如果两个对象那个具有相同的引用,他们一定是相同的,从这方面看,将其作为默认操作也是合乎情理的。然而对于多数类来说,这种判断没有意义,通常我们需要将测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。

==equals的区别

  • 值类型(int,char,long,boolean等)都是用==判断相等性。对象引用的话,==判断引用所指的对象是否是同一个。
  • equals是Object的成员函数,有些类会覆盖(override)这个方法,用于判断对象的等价性。

例如String类,两个引用所指向的String都是”abc“,但可能出现他们实际对应的对象并不是同一个(和jvm实现方式有关),因此用==判断他们可能不相等,但用equals判断一定是相等的。总体来说要搞清楚,还是需要先理解清楚对象实体和引用之间的关系。

instanceof

instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

相等测试与继承

如果隐式和显式参数不属于同一个类,equals方法将如何处理呢?

public class Employee {
private String name;
private String hireDay;
private int salary; public boolean equals(Object otherObject) {
//首先简单的测试一下对象是否相等
if(this ==otherObject) return true; //判空
//如果这里不进行判空,会出现什么后果
if(otherObject ==null) return false; //如果对象所属类不匹配,则他们不相等
if(getClass() != otherObject.getClass()) return false; Employee other = (Employee) otherObject; //判断对象里面的内容是否相等
//若果在构造对象时,没有对里面一个或者多个内容进行赋值,即有些内容为null,这里或出现什么后果?
return name.equals(other.name)
&&salary == other.salary
&&hireDay.equals(other.hireDay);
} }

java语言的规范要求equals方法具有下面的特性

  • 对称性: 对于任何引用x和y,当且仅当x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true” ;

这里有一个问题:首先假设一个类的对象为y,其子类的对象为x,加入在equals中使用instanceof进行比较

y.equals(x);中会返回true

然而:x.equals(y) 会返回false

这不符合equals的对称性!!!

建议:

如果子类能够拥有自己的相等概念,则对称性需求将强制采取getClass进行检测

如果由超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同的子类的对象之间进行相等的比较。

  • 自反性: 对于任何非空引用x,x.equals(x)应该返回“true” ;

  • 传递性: 对于任何引用x和y,如果x.equals(y)返回是“true”,y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true” ;

  • 一致性: 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果

  • 对于任意非空引用x,x.equals(null)应该返回false

编写一个完美的equals方法的建议

  1. 显示参数命名为otherobject,稍后将他转换成另一个叫做other的变量

  2. 检测thisotherObject 是否引用同一个对象

  3. 检测otherObject 是否为null,返回false

  4. 比较thisotherObject是否属于同一个类

    • 如果equals的予以在每个子类中有所改变,就是用getClass检测

    • 如果素有的子类拥有同意的语义,就使用instanceof检测

  5. otherObject转换为相应的类类型的变量

  6. 对对象的域进行比较:使用==比较基本类型域,使用equals比较对象域

最新文章

  1. Python~字典
  2. 数据结构Java实现01----算法概述
  3. CCNA第二章TCP/IP简介考试要点学习笔记
  4. Javascript对象赋值操作
  5. LeetCode Binary Search Tree Iterator
  6. Web Api 2 怎么支持 Session
  7. php使用注意点
  8. HDU 1520-Anniversary party(树形dp入门)
  9. 【Xamarin挖墙脚系列:现有IPhone/IPad 设备尺寸】
  10. C++内存管理(超长)
  11. .NET基础——方法
  12. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self
  13. linux命令dd
  14. Linux C 编程
  15. store.state
  16. 部署WEB项目到服务器(三)安装mysql到linux服务器(Ubuntu)详解
  17. Rancher2.0中使用外置NFS存储部署Nginx实验
  18. cordova文件传输系统插件使用:cordova-plugin-file-transfer
  19. 使用InstallAnywhere7.1制作Java exe程序安装包
  20. django基础-01:软件框架,MVC框架,MVT

热门文章

  1. 关于view.py 中 ajax json 的用法
  2. 查询oracle数据字典,并对应出hive的数据类型
  3. Python实现链表
  4. Windows下静态库与动态库的创建与使用
  5. /* * 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 *(包括学生号,姓名,三门课成绩),计算出平均成绩, *将原有的数据和计算出的平均分数存放在磁盘文件&quot;stud&quot;中。 */
  6. PHP防止网页快速刷新+代理ip访问
  7. bzoj4361 isn(树状数组优化dp+容斥)
  8. WINDBG常用方法
  9. CentOS 6.5优化开机启动服务
  10. 剑指offer(4)重建二叉树