我們一般不會(huì)動(dòng)這兩個(gè)方法,但是如果我們達(dá)到某種需求畜眨,如object1.equals(object2)為true乘陪,那你必須得重寫(xiě)這兩個(gè)方法。
注意:當(dāng)此方法被重寫(xiě)時(shí)氢拥,通常有必要重寫(xiě) hashCode 方法蚌铜,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼嫩海。如下:
(1)當(dāng)obj1.equals(obj2)為true時(shí)冬殃,obj1.hashCode() == obj2.hashCode()必須為true
(2)當(dāng)obj1.hashCode() == obj2.hashCode()為false時(shí),obj1.equals(obj2)必須為false
怎么重寫(xiě)叁怪,我們先定義一個(gè)類:
class ObjectM {
int id;
String name;
}
那我們先重寫(xiě)equals()审葬,很簡(jiǎn)單:
boolean equals(Object o) {
if(o == null) {
return false;
}
if (o == this) {
return true;
}
if (getClass() != o.getClass()) {
return false;
}
ObjectM m = (ObjectM) o;
return (this.id == m.id);
}
光是寫(xiě)equals()方法還不行,我們還得重寫(xiě)hashCode()方法奕谭,我們先看看hashCode()方法:
hashCode()方法被用來(lái)獲取給定對(duì)象的唯一整數(shù)涣觉。這個(gè)整數(shù)被用來(lái)確定對(duì)象被存儲(chǔ)在HashTable類似的結(jié)構(gòu)中的位置。默認(rèn)的血柳,Object類的hashCode()方法返回這個(gè)對(duì)象存儲(chǔ)的內(nèi)存地址的編號(hào)官册。
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
}
注意事項(xiàng):
盡量保證使用對(duì)象的同一個(gè)屬性來(lái)生成hashCode()和equals()兩個(gè)方法。在我們的案例中,我們使用id难捌。
eqauls方法必須保證一致(如果對(duì)象沒(méi)有被修改膝宁,equals應(yīng)該返回相同的值)
任何時(shí)候只要a.equals(b),那么a.hashCode()必須和b.hashCode()相等。
兩者必須同時(shí)重寫(xiě)根吁。