如何编写高质量equals方法

什么是equals方法

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

Object类中的equals方法

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

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

我们可以观察到几点:

equals方法是public修饰的,外部类是可以访问的

equals方法的返回值boolean,true为两个对象相等,false为两个对象不等

参数类型为Object,是其子类都可以比较

方法体判断的是两者的引用是不是相等

实际上为什么要编写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操作符检查参数是否为正确的类型

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

因为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方法必须满足这三大特性

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索equal
, object
, equals
, 方法
, 类型
, person
, 相等性判断
equals方法
如何编写高质量代码、编写高质量代码、编写高质量代码 pdf、编写高质量代码之java、编写高质量的代码,以便于您获取更多的相关知识。

时间: 2024-12-31 11:10:44

如何编写高质量equals方法的相关文章

编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

原文:编写高质量代码改善C#程序的157个建议[为泛型指定初始值.使用委托声明.使用Lambda替代方法和匿名方法] 前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们

编写高质量代码改善C#程序的157个建议[匿名类型、Lambda、延迟求值和主动求值]

原文:编写高质量代码改善C#程序的157个建议[匿名类型.Lambda.延迟求值和主动求值] 前言 从.NET3.0开始,C#开始一直支持一个新特性:匿名类型.匿名类型由var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 1.既支持简单类型也支持复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 2.匿名类型的属性是只读的,没有属性设置器,它一旦倍初始化就不可更改. 3.如果两个匿名类型的属性值相同,那么就任务这两个匿名类型

编写高质量代码改善C#程序的157个建议[10-12]

原文:编写高质量代码改善C#程序的157个建议[10-12] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议10.创建对象时需要考虑是否实现比较器 建议11.区别对待==和Equals 建议12.重写Equals时也要重写GetHashCode 建议10.创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,就像小时候每次拿着考卷回家,妈妈都会问你隔壁的那谁谁谁考了多少分呀.下面我们也来举个简单

如何编写高质量的Javascript代码(1)

优秀的Stoyan Stefanov在他的新书中(<Javascript Patterns>)介绍了很多编写高质量代码的技巧,比如避免使用全局变量,使用单一的var关键字,循环式预存长度等等. 这篇文章不仅仅从代码本身来考虑如何优化编码,也从代码的设计阶段来考虑,包括书写API文档,同事的review,使用JSLint.这些习惯都能帮助你编写更加高质量的.更易于理解的.可维护的代码(让你的代码在多年之后仍使你引以为傲). 编写可维护的代码 软件的BUG修复需要花费大量的精力.尤其当代码已经发布

如何编写高质量的VB代码(1)

如何编写高质量的VB代码 简介: 本文描述了如何通过一些技术手段来提高VB代码的执行效率.这些手段可以分为两个大的部分:编码技术和编译优化技术.在编码技术中介绍了如何通过使用高效的数据类型.减少外部引用等编程手段来提高代码执行速度,减少代码消耗的系统资源.在编译优化技术中介绍了如何正确地利用VB提供的编译选项对在编译时最后生成的可执行文件进行优化. 前言 什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源.这篇文章汇集了作者在使用VB进行软件开发

如何编写高质量的VB代码(2)

如何编写高质量的VB代码(2) 12. 销毁对象 无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间.但遗憾的是很多程序员对这一点好像并不是很在意.正确的做法是在退出程序前需要销毁程序中使用的对象.例如:Dim FSO as New FileSystemObject注释: 执行操作注释: 销毁对象Set FSO = Nothing对于窗体,可以进行卸载:Unload frmMain 或Set frmMain = Nothing 13. 变长和定长字符串 从技术上

编写高质量代码改善C#程序的建议:泛型集合、选择集合和集合的安全

前言 软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议20.使用泛型集合来替代非泛型集合 建议21.选择正确的集合 建议22.确保集合的线性安全 建议

《编写高质量代码:改善c程序代码的125个建议》—— 导读

前 言 为什么写作本书 众所周知,C语言是一门既具有高级语言特点,又有汇编语言特点的通用计算机编程语言,无论是操作系统(如Microsoft Windows.Mac OS X.Linux和UNIX等).嵌入式系统与普通应用软件,还是目前流行的移动智能设备开发,随处都可以看见它依然矫健的身影.它能够轻松地应用于各类层次的开发中,从设备驱动程序和操作系统组件到大规模应用程序,它都能够很好地胜任.毋庸置疑,它是二十几年来使用最为广泛.生命力最强的编程语言,它的设计思想也影响了众多后来的编程语言,例如C

编写高质量代码改善C#程序的157个建议[4-9]

原文:编写高质量代码改善C#程序的157个建议[4-9] 前言 本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html.本文主要来学习记录一下内容: 建议4.TryParse比Parse好 建议5.使用int?来确保值类型也可以为null 建议6.区别readonly和const的使用方法 建议7.将0值设为枚举的默认值 建议8.避免给枚举类型的元素提供显式的值 建议9.习惯重载运算符 建议4.TryParse比Parse好 如果注意观察,除st