Java对象的equals方法分析与重写

时间:2022-09-14 16:06:32

  Java中,对于对象的比较,如果用“==”比较的是对象的引用,'=='运算符比较两个对象的地址;

  equals才是比较的对象的内容,且Object类的equals方法的默认实现也是按照内存地址比较对象是否相等。

  Javaequals方法有以下特性:

  1、自反性:对任意引用值X,x.equals(x)的返回值一定为true.
  2、对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
  3、传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
  4、一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
  5、非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

  所以重写equals()方法时,要满足以上五个特性并且要根据实例域的类型进行不同的比较:
  1、对象域,使用equals方法
  2、 类型安全的枚举,使用equals或==
  3、可能为null的对象域 : 使用 == 和 equals
  4、数组域 : 使用 Arrays.equals
  5、除float和double外的原始数据类型 : 使用 ==
  6、float类型: 使用Float.foatToIntBits转换成int类型,然后使用==
  7、double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==

public class TbSpinfo
{
   private String id;  //id属性
   private String spname; //商品名称
   public String getId() {
	return id;
   }
   public void setId(String id) {
	this.id = id;
   }
   public String getSpname() {
	return spname;
   }
   public void setSpname(String spname) {
	this.spname = spname;
   }
   public boolean equals(Object obj)
   {
     if(this == obj)
       return true; //自反性:对任意引用值X,x.equals(x)的返回值一定为true.
     if(obj == null)
       return false; //非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
     if(getClass() != obj.getClass())
       return false;  //自反性:对任意引用值X,x.equals(x)的返回值一定为true.
     final TbSpinfo other = (TbSpinfo)obj;
     //进行域的比较
     if(id == null) //先判断类中bz变量是否为空,可能为null的对象域
     {
       if(other.id != null) //判断引用变量other中bz是否为空,可能为null的对象域
       return false;
     }else if(!id.equals(other.id))
        return false; //传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
     if(spname == null)
     {
       if(other.spname != null)
         return false;
     }else if(!spname.equals(other.spname))
        return false;
     return true;
   }
}

本文借鉴了denlee的关于实例域的类型进行不同的比较的部分,大家可以参见他的博客内容。http://blog.csdn.net/denlee/article/details/3081722