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声明有助于错误检查。

  示例如下:

 1 class Person
 2 {
 3     private String name;
 4     private int age;
 5
 6     public String getName()
 7     {
 8         return name;
 9     }
10     public int getAge()
11     {
12         return age;
13     }
14     @Override public boolean equals(Object otherObject)
15     {
16         if(this == otherObject)
17             return true;
18         if(otherObject == null)
19             return false;
20        if(getClass() != otherObject.getClass())
21             return false;
22         Person other = (Person)otherObject;
23         return (name.equals(other.name) && (age == other.age));
24     }
25 }
26 class Employee extends Person
27 {
28     private String occupation;
29
30     @Override public boolean equals(Object otherObject)
31     {
32         if(this == otherObject)
33             return true;
34         if(otherObject == null)
35             return false;
36         if(getClass() != otherObject.getClass())
37             return false;
38         if(!super.equals(otherObject))
39             return false;
40         Employee other = (Employee)otherObject;
41         return occupation.equals(other.occupation);
42      }
43 }   
时间: 2024-08-07 07:01:05

Java中编写一个完美的equals方法的相关文章

Java:Object类的equals()方法 如何编写一个完美的equals()方法

一  代码实例: package freewill.objectequals;  /** * @author freewill * @see Core Java page161 * @desc getClass实现方式,另有instance of实现方式,根据不同场景使用. */  public class Employee {      private String name;      private int salary;      private String hireDay;     

Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hashCode()和equals()的用法 重写默认实现 使用Apache Commons Lang包重写hashCode()和equals() 需要注意记住的事情 当使用ORM的时候特别要注意的 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的jav

java中如何实现一个优美的equals方法

java中的任何类都从老祖宗Object中集成了equals方法,在编程实践中应用使用equals方法判断两个对象是否相同的场景无处不在,所以我们在实现自己的类是必须重写出一个优美的equals方法. 首先让我们来看看java语言规范中对equals方法的说明,一个equals方法应当满足如下几个特性: 自反性,对任何一个非空的引用x,x.equals(x)必须返回true: 对称性,对任何引用x和y来说,如果x.equals(y)返回true,那么y.equals(x)也必须返回true: 传

Effective Java 第三版——10. 重写equals方法时遵守通用约定

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 10. 重写equals方法时遵守通用约定 虽然Object是一个具体的类,但它主要是为继承而设计的.它的所有非 final方法(equals.hashCode.toStr

Java中字符串比较时==和equals的区别

==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = "abc"; a == b返回true,a.equals(b)同样返回true,这是为什么呢? 原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个. 上例中创建a时,会在字符串池中首先创建一个"abc&qu

C#和JAVA中编写事务代码

C#  DAL层代码,执行多条增删改,使用事务操作: /// <summary> /// 执行 多条增删改 (非查询语句) /// </summary> /// <param name="strSql"></param> /// <param name="paras"></param> /// <returns></returns> public static int E

java中常用的字符串的截取方法

java中常用的字符串的截取方法   1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len=s.length(); 2.charAt() 截取一个字符 例:char ch; ch="abc".charAt(1); 返回'b' 3.getChars() 截取多个字符 void getChars(int sourceStart,int sourceEnd,char target

java中获取日期和时间的方法总结

1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); date.getTime() ; 还有一种方式,使用 System.currentTimeMillis() ;都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数 一.获取当前时间,   格式为:   yyyy-mm-dd   hh-mm

为什么要用缓存服务器以及在 Java 中实现一个 redis 缓存服务

缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架构 在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层.在用户量小,数据量不太大的情况下,这个系统运行得很顺畅.但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢.系统的瓶颈一般都在数据库访问上.这个时候可能会将上面的架构改成下面的来缓解数