Java中编写一个完美的equals方法
首先看下Java语言规范对equals方法的要求:
1,自反性,对于任何非控引用x,x.equals(x)都应该返回true。
2,对称性,对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3,传递性,如果x.equals(y),y.equals(z)都返回true,那么,x.equals(z)返回true。
4,一致性,如果x和y引用的对象没有发生变化,那么无论调用多少次x.equals(y)都返回相同的结果。
5,对于任意非空引用x,x.equals(null)都应该返回false。
Object类中的equals方法用于检测两个对象是否相等,而相等判断的标准则是二者是否引用同一个对象。
下面给出编写一个完美的equals方法的原则:
1,将equals的Object类显式参数命名为otherObject。
2,检测otherObject是否与this引用自同一个对象。
3,检测otherObject是否为null,是的话返回false。
4,检测this与otherObject是否属于同一个类,这里需要注意的情况就是当比较的两个对象不属于同一个类时,比如p.equals(e),p是一个Person,e是一个Employee,Employee继承自Person。Person拥有name,age私有域,Employee具有occupation域。
如果相等的概念是的对象的所有域都必须相等,p.equals(e)中使用e instalceof Person返回true,但是如果e.equals(p)调用,p instanceof Employee则返回false,不满足对称性要求,所以这里需要强制采用getClass()来进行类型检测。
如果相等的概念是由超类决定的,比如认为只要name和age相同,则Person和Employee相等,则可以使用instance进行检测,同时在超类中将该方法定义为final。
5,将otherObject转换为this类型的变量。
6,现在开始进行私有数据域的比较,对于基本类型如数值,字符和布尔类型使用==进行比较,对对象域使用equals进行比较,所有域都相同则返回true。
7,使用@Override声明有助于错误检查。
示例如下:
class Person
{
private String name;
private int age; public String getName()
{
return name;
}
public int getAge()
{
return age;
}
@Override public boolean equals(Object otherObject)
{
if(this == otherObject)
return true;
if(otherObject == null)
return false;
if(getClass() != otherObject.getClass())
return false;
Person other = (Person)otherObject;
return (name.equals(other.name) && (age == other.age));
}
}
class Employee extends Person
{
private String occupation; @Override public boolean equals(Object otherObject)
{
if(this == otherObject)
return true;
if(otherObject == null)
return false;
if(getClass() != otherObject.getClass())
return false;
if(!super.equals(otherObject))
return false;
Employee other = (Employee)otherObject;
return occupation.equals(other.occupation);
}
}
Java中编写一个完美的equals方法的更多相关文章
- Java:Object类的equals()方法 如何编写一个完美的equals()方法
		
一 代码实例: package freewill.objectequals; /** * @author freewill * @see Core Java page161 * @desc get ...
 - 如何在Java中编写一个线程安全的方法?
		
线程安全总是与多线程有关的,即一个线程访问或维护数据时遭到了其它线程的“破坏”,为了不被破坏,就要保持所维护变量的原子性: 1 局部变量总是线程安全的,因为每个线程都有自己的栈,而在方法中声明的变量都 ...
 - (转)Java 中正确使用 hashCode 和 equals 方法
		
背景:最近在编写持久化对象时候遇到重写equals和hashCode方法的情况,对这两个方法的重写做一个总结. 链接:https://www.oschina.net/question/82993_75 ...
 - Java 中正确使用 hashCode 和 equals 方法
		
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
 - Java中正确使用hashCode和equals方法
		
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
 - java中copy 一个list集合的方法
		
java将一个list里的数据转移到另外一个list,可以使用for语句,一次使用add方法,示例如下: ArrayList list1=new ArrayList(); list1.add(&quo ...
 - Java中的Object类的toString()方法,equals()方法
		
Object类是所有类的父类,若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法: 1.toString 如果输出一个对象的时候 ...
 - Effective Java 第三版——10. 重写equals方法时遵守通用约定
		
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
 - java中获取日期和时间的方法总结
		
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
 
随机推荐
- checkBox的全选与全不选
			
//初始加载 $(function () { LoadCart(); }); var RMB = 0; var Index = 0; var shu = 0; var ResultStr = &q ...
 - 搭建邮件服务器 使用Postfix与Dovecot
			
首先需要从yum中下载安装三个服务:bind-chroot postfix dovecot 配置文件依次: /etc/named.conf 下载安装完后要开启的服务:named ...
 - StarUml3.10 Mac 注册key 破解
			
/Applications/StarUML.app/Contents/Resources StarUML是用nodejs写的.确切的说是用Electron前端框架写的.新版本中所有的starUML源代 ...
 - PdgCntEditor系列教程一:基础知识
			
一.PdgCntEditor是什么? 二.为什么要用PdgCntEditor? 三.怎么用PdgCntEditor? 一.PdgCntEditor是什么? 这是一个目录编辑器,可以创建.编辑PDF.D ...
 - shape和reshape
			
import numpy as np a = np.array([1,2,3,4,5,6,7,8]) #一维数组 print(a.shape[0]) #值为8,因为有8个数据 print(a.shap ...
 - 修改默认runlevel
			
CentOS直接修改文件 /etc/inittab 就好了 # Default runlevel. The runlevels used are: # - halt (Do NOT set init ...
 - go读写文本文件
			
一.文件读取 1. 将整个文件读取到内存中 package main import ( "flag" "fmt" "io/ioutil" ) ...
 - LeetCode Array Easy 414. Third Maximum Number
			
Description Given a non-empty array of integers, return the third maximum number in this array. If i ...
 - elasticsearch  Java High Level REST 相关操作封装
			
pox.xml文件添加以下内容 <dependency> <groupId>org.elasticsearch.client</groupId> <artif ...
 - 大哥带我走渗透4(中)----oracle报错注入
			
5/30 报错注入 0x01 准备阶段 1. 基础知识今天了解了,但是,只能看懂和最基本的理解,不能自己上路.所以,还是要不停学习基础.并且及时总结.这有一篇很详细的文章:https://www.cn ...