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