重寫equals方法的注意點
1. 自反性:對於任意的引用值x,x.equals(x)一定爲true
2. 對稱性:對於任意的引用值x 和 y,當x.equals(y)返回true,y.equals(x)也一定返回true
3. 傳遞性:對於任意的引用值x、y和z,如果x.equals(y)返回true,並且y.equals(z)也返回true,那麼x.equals(z)也一定返回 true
4. 一致性:對於任意的引用值x 和 y,如果用於equals比較的對象信息沒有被修改,多次調用x.equals(y)要麼一致地返回true,要麼一致地返回false
5. 非空性:對於任意的非空引用值x,x.equals(null)一定返回false
重寫equals方法的正確示例
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Person person = (Person)obj;
if (this.name = null) {
return person.getName() == null;
} else {
return this.name.equals(person.getName());
}
}
@override
public int hashCode() {
return new HashCodeBuilder().append(name).toHashCode();
}
}
說明:
1. 在equals中使用getClass進行類型判斷。因爲instanceof在繼承對象中可能會引起對稱性的問題。
2. 重寫equals方法必須重寫hashCode方法。如果不重寫,那麼諸如HashMap中對比的方法將會失效。