由於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;
}
}