由于Object类默认提供的equals方法,只是比较对象的地址,即其比较的结果和"=="的结果是一样的.
而实际应用中,对象是否相等是由对象特征所决定的,由此Object提供的equal方法,不可用,需要重写.
而写equals方法,应试满足下列条件:
自反性:对任意X,X.equals(X)一定返回为true;
对称性:对任意X,Y,如果X.equals(Y)为true,那么Y.equals(X)也必须为true;
传递性:对任意X,Y,Z,如果X.equals(Y)为true,Y.equals(Z)为true,那么X.equals(Z)也必须true;
一致性:对任意X,Y,如果对象中用于比较的信息,没有发生改变,那么无论调用多少次X.equals(Y),或者Y.equals(X),其结果必须是一样的.要么一直为true,要么一直为false;
对任何不是null的X,X.equals(null),必须为false;
另:有部分人在equals()方法中,用了instanceof运算,但是其有一定问题.
instanceof判断是的前面对象为否为类的实例或其子类,如果则返回true.
综上,所以一般equals方法重写为:
package com.study;
/**
* Created with IntelliJ IDEA.
* User: KING
* Date: 12-9-10
* Time: 下午5:05
*/
public class Dog {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean equals(Object obj) {
//同一对象直接返回true;
if (this == obj) {
return true;
}
//只有当obj不为空,且为当前类时,才做对象特征比较
if (obj != null && obj.getClass() == Dog.class) {
Dog dog = (Dog) obj;
if (this.getId() == dog.getId()) {
return true;
}
}
return false;
}
}