Posted on 2008-08-04 14:38
追风舞者 阅读(190)
评论(0) 编辑 收藏 所属分类:
J2SE
Java语言中的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引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5. 对于任何非空引用x,x.equals(null)应该返回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常数,例如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),然后将计算结果按步骤2.A.iii处理。
vi. 如果字段是个object reference,而且class 的equals()透过「递归呼叫equals()」的方式来比较这一字段,那么就同样也对该字段递归呼叫hashCode()。
vii. 如果字段是个array,请将每个元素视为独立字段。也就是说对每一个有意义的元素施行上述规则,用以计算出hash 码,然后再依步骤2.B将这些数值组合起来。
B. 将步骤A计算出来的hash码 c按下列公式组合到变量result中:result = 37*result + c;
3. 传回result。
4. 完成hashCode()之后,反躬自省一下:是否相等的实体具有相等的hash 码?如果不是,找出原因并修正问题。