Posted on 2008-08-04 14:38
追風(fēng)舞者 閱讀(195)
評論(0) 編輯 收藏 所屬分類:
J2SE
Java語言中的equals的規(guī)范:
1. 自反性:對于任何一個非空引用x,x.equals(x)應(yīng)該返回true;
2. 對稱性:對于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應(yīng)該返回true。
3. 傳遞性:對于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true。
4. 一致性:如果x和y引用的對象沒有發(fā)生變化,那么反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果。
5. 對于任何非空引用x,x.equals(null)應(yīng)該返回false。
public boolean equals(Object obj) {
boolean result = false;
if (this == obj)
return true;
if (!(obj instanceof Student))
return false;
Student objTemp = (Student) obj;
if (this.getId() == objTemp.getId())
result = true;
return result;
}
Java語言中的hashcode:
1. 將一個非0常數(shù),例如17,儲存于int result變量中。
2. 對對象中的每一個有意義的字段f(更確切地說是被equals()所考慮的每一個字段)進行如下處理:
A. 對這個字段計算出型別為int的hash 碼 c:
i. 如果字段是個boolean,計算(f ? 0 : 1)。
ii. 如果字段是個byte,char,short或int,計算(int)f。
iii. 如果字段是個long,計算(int)(f^(f >>> 32))。
iv. 如果字段是個float,計算Float.floatToIntBits(f)。
v. 如果字段是個double,計算Double.doubleToLongBits(f),然后將計算結(jié)果按步驟2.A.iii處理。
vi. 如果字段是個object reference,而且class 的equals()透過「遞歸呼叫equals()」的方式來比較這一字段,那么就同樣也對該字段遞歸呼叫hashCode()。
vii. 如果字段是個array,請將每個元素視為獨立字段。也就是說對每一個有意義的元素施行上述規(guī)則,用以計算出hash 碼,然后再依步驟2.B將這些數(shù)值組合起來。
B. 將步驟A計算出來的hash碼 c按下列公式組合到變量result中:result = 37*result + c;
3. 傳回result。
4. 完成hashCode()之后,反躬自省一下:是否相等的實體具有相等的hash 碼?如果不是,找出原因并修正問題。