什么是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. NSOJ Constructing Roads(图论)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  2. A + B Again 2057 有符号的64进位的运算

    Problem Description There must be many A + B problems in our HDOJ , now a new one is coming.Give you ...

  3. crawler_http关闭连接

    1:ps aux|grep Spider4Test.jar 查看端口 2: lsof  -p [端口号] 在爬虫运行期间如果看到 大量的 TIME_WAIT  WAIT_CLOSE 说明请求关闭阻塞[ ...

  4. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  5. CSS3+HTML5特效2 - 翻转效果

    先看效果,鼠标移上去看看. back front 1. 本实例需要以下元素 a. 容器BOX b. 默认显示元素FRONT c. 翻转显示元素BACK 2. 容器BOX的Height为200px,Wi ...

  6. php传引用和全局变量

    原文:php传引用和全局变量 <?php /* * 函数内部改变变量的值两种方法 */ $a = 10; /* *方法一 :函数参数传引用 */ function methodOne(& ...

  7. vector查找元素

    转自:http://hi.baidu.com/chain2008/blog/item/821744585e12c5c89c8204e8.html 今天又忘了怎么在vector中查找某一个值..唉..每 ...

  8. monoTouch for android visual studio c#开发

    本人  c# 程序员,第一次配置环境 按照此流程安装   http://www.wuleba.com/18892.html 本次下载的 8 个安装程序,我是安装以上顺序安装的,分别标志为1至8,暂时不 ...

  9. 代理模式与Android

    代理模式(Proxy) 一.   什么是代理模式 先来看看官方的说法,代理模式就是为其它对象提供一种代理,以控制对这个对象的訪问. 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不 ...

  10. 我所理解的Spring AOP的基本概念

    Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了非常多样例后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 如果一个OA系统中的一个 ...