编写高质量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操作符检查参数是否为正确的类型
因为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方法的更多相关文章
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode
建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Pe ...
- 编写高质量代码改善C#程序的157个建议——建议11: 区别对待==和Equals
建议11: 区别对待==和Equals 在开始本建议之前,首先要明确概念“相等性”.CLR中将“相等性”分为两类:“值相等性”和“引用相等性”.如果用来比较的两个变量所包含的数值相等,那么将其定义为“ ...
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
- 编写高质量JS代码的68个有效方法(八)
[20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(七)
[20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(六)
[20141213]编写高质量JS代码的68个有效方法(六) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(四)
[20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(三)
[20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
随机推荐
- NYNU_省赛选拔题(10)
题目描述 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog ...
- ACM竞赛之输入输出
http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetail 比赛描述 字符串的输入输出处理. 输入 第 ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- hdu 3449 (有依赖的01背包)
依赖背包 事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性. fj打算去买一些东西,在那之前,他需要一些盒子去装他打算要买的不同的物品.每一个盒子 ...
- crawler_httpclient代理访问
public String getDocumentByProxy(String url) throws ClientProtocolException, IOException { DefaultHt ...
- DM8168 layout
我们学到了以前的系统板的教训,新的版本号DM8168烤... 一级:电源.DM8168.DDR3.FPGA.CPLD.Nandflash.USB.以太网络.SATA.JTAG等待. 的地面电源部充分. ...
- 华为机试 之 joseph环
一:首先科普一下约瑟夫问题的数学方法 (1) 不管是用list实现还是用vector实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比較烦,并且时间复杂度高达O(nm),当n,m很大(比如上百 ...
- 【转】UiAutomator简要介绍
原文地址:http://blog.csdn.net/g19920917/article/details/16131565 3.1.必备条件: 1.JDK 2.SDK(API高于15) 3. ...
- [ Bubble Sort ]& block
[ Bubble Sort ] 冒泡排序!“预处理.block.预编译”!<环境:Terminal的gcc编译器> 简述:冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个 ...
- TDD
初识TDD 首先说一下名词解释,TDD,英文名称Test-Driven Development,中文名称测试驱动开发,简单的断下句“测试/驱动/开发”,简单的理解一下,就是测试驱动着开发,大白话就是说 ...