什么是equals方法

  指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否相等。

Object类中的equals方法

  一起来看看Object类中的源代码

    public boolean equals(Object obj) {
return (this == obj);
}

  我们可以观察到几点:

  1. equals方法是public修饰的,外部类是可以访问的    
  2. equals方法的返回值boolean,true为两个对象相等,false为两个对象不等
  3. 参数类型为Object,是其子类都可以比较
  4. 方法体判断的是两者的引用是不是相等

实际上为什么要编写equals

  在我们的实际的操作中,有下面的例子:

    @Test
public void whyUseEquals() {
User user1 = new User("xujianguo", 21);
User user2 = new User("xujianguo", 21);
System.out.println(user1.equals(user2));
}

发user1和user2的name都是xujianguo,age都是21的,按照我们的逻辑是同一个人,都是如果没有重写equals方法,默认采用Object的equals方法的话,结果就是false的,所以我们必须实现equals来实现我们的逻辑。

高质量equals方法

  1.使用instanceof操作符检查参数是否为正确的类型

    因为equals的参数为Object,你的类是Person,但是这个参数很可能不是Person类型的,可能是User类型的,这样的话就不符合你的判断的,使用instanceof可以判断你的参数是否为正确的你要的处理的类型。

    @Override
public boolean equals(Object object) {
if(!(object instanceof Person)) {
return false;
} else {
//...
return true;
}
}

  2.把参数转化为正确的类型

    在前面进行了类型的判断后,就需要进行类型的转换,转换成需要的类型我们才能进行后续的操作。

    @Override
public boolean equals(Object object) {
if(!(object instanceof Person)) {
return false;
} else {
Person person = (Person)object;
//...
return true;
}
}

  3.匹配参数中的域情况

    这里就是你的逻辑的实现,你的两个对象要怎么样才相等,对于我的这个Person类来说,name一样并且age一样,两个就相等了。

    @Override
public boolean equals(Object object) {
if(!(object instanceof Person)) {
return false;
} else {
Person person = (Person)object;
if(person.getName().equals(name) && person.getAge() == age) {
return true;
} else {
return true;
}
}
}

  4.编写完成equals方法后,检查其三大特性:自反性、对称性、传递性

  • 自反性:对于任何非空引用值x,都有x.equals(x)返回true    
  • 对称性:对于任何非空引用值x、y,当x.equals(y)返回true的时候,y.equals(x)也返回true
  • 传递性:对于任何非空引用值x、y、z,当x.equals(y)并且y.equals(z)都返回true的时候,有x.equals(z)返回true

  高质量的equals方法必须满足这三大特性

编写高质量equals方法的更多相关文章

  1. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  2. 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode

    建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Pe ...

  3. 编写高质量代码改善C#程序的157个建议——建议11: 区别对待==和Equals

    建议11: 区别对待==和Equals 在开始本建议之前,首先要明确概念“相等性”.CLR中将“相等性”分为两类:“值相等性”和“引用相等性”.如果用来比较的两个变量所包含的数值相等,那么将其定义为“ ...

  4. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  5. 编写高质量JS代码的68个有效方法(八)

    [20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  6. 编写高质量JS代码的68个有效方法(七)

    [20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  7. 编写高质量JS代码的68个有效方法(六)

    [20141213]编写高质量JS代码的68个有效方法(六) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  8. 编写高质量JS代码的68个有效方法(四)

    [20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  9. 编写高质量JS代码的68个有效方法(三)

    [20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

随机推荐

  1. 【Python】Python的urllib模、urllib2模块的网络下载文件

    因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...

  2. 更新内置flash方法[转]

    原文地址:http://bbs.theworld.cn/thread-223573-1-1.html 由于目前flash插件版本较旧,而旧版flash可能会导致崩溃,其实更新方法很简单,请看如下教程. ...

  3. 软件project(十)——软件维护

    软件维护是软件开发的最长的阶段之一,的精力和费用也是最多的一个阶段,基本上软件交付之后就进入了维护阶段,占整个系统生存周期的40%~70%. 导图:         软件系统并非一成不变的.有时候我们 ...

  4. NPOI实现Excel导入导出

    NPOI实现Excel的导入导出,踩坑若干. Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 P ...

  5. 【分享】小工具大智慧之Sql执行工具

    原文:[分享]小工具大智慧之Sql执行工具 工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分析器里执行,按理说应该写一些专门的工具 ...

  6. javascript系列之核心知识点(二)

    变量对象       变量对象是一个与执行上下文相关联的容器.它是一个和上下文密切结合的特殊对象,含有定义在上下文中的变量和函数声明.注意,函数表达式(和函数声明不同的)不包含在变量对象中. 变量对象 ...

  7. php exit、return、break、continue之间的差别,具体介绍

    相信大家在php开发中有几个经常使用的停止程序和循环的keyword的误区( exit.return.break.continue) exit 退出全部脚本,是个函数 return 语言结构的使用方法 ...

  8. 快速构建Windows 8风格应用2-创建调试应用

    原文:快速构建Windows 8风格应用2-创建调试应用 本篇博文主要介绍的是创建应用时可以选择哪些模版,生成默认的Windows 8风格应用解决方案中含哪些文件,最后是如何调试Windows 8风格 ...

  9. Java泛型和集合之泛型VS模板

    Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号  是因为他 ...

  10. 一个web开发框架

    一个web开发框架 怎么才能成为一名架构师?需要具备哪些条件? 作为一名码农我迫切希望自己成为一个比较合格的web架构师,昨晚心血来潮小弟花了4个小时的时间整了个简易的web开发框架,由于第一次搭建框 ...