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

来源:互联网 发布:lr监控windows资源 编辑:程序博客网 时间:2024/06/06 01:04

  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


   

0 0