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