什么是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. ubuntu14.04通过将语音,耳机没有声音

    真正使用linux每天都有新的发现啊,截至今天上午有一台电脑,听几首歌.后插上耳机中没有声音.我认为这是一个糟糕的耳机,把插在手机耳机,我发现了一个语音耳机,很奇怪,我喜欢计算机接口是不是有问题,是在 ...

  2. 三个水杯 (bfs)

    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...

  3. 分析RAC下一个SPFILE整合的三篇文章的文件更改

    大约RAC下一个spfile分析_整理在_2014.4.17 说明:文章来源于网络 第一篇:RAC下SPFILE文件改动 在RAC下spfile位置的改动与单节点环境不全然一致,有些地方须要特别注意, ...

  4. 持续集成Jenkins + robot framework + git

    Jenkins + robot framework + git持续集成 一.Jenkins安装插件 进入系统管理—插件管理—可选插件下安装以下插件Git Client Plugin.GIT plugi ...

  5. C#工具类(包含获取枚举描述方法)

    //把一个对象转换成功键值对字典格式 var obj = new { CustomerId = customerId }; var dic = obj.ToDictionray(); public s ...

  6. hive union all 使用

    功能:将两个表中的 同样的字段拼接到一起 測试: create external table IF NOT EXISTS temp_uniontest_ta ( a1 string, a2 strin ...

  7. 【高德地图API】汇润做爱地图技术大揭秘

    原文:[高德地图API]汇润做爱地图技术大揭秘 昨日收到了高德地图微信公众号的消息推送,说有[一大波免费情趣用品正在袭来],点进去看了一眼,说一个电商公司(估计是卖情趣用品的)用高德云图制作了一张可以 ...

  8. 程序员面试必备经典CTCI,谷歌面试官经典作品!

    1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ...

  9. 【麦子学院】OpenCV教程函数总结

    个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...

  10. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...