hashCode:
他是用来产生hash值的,用在Hashtable上,也包括HashMap等实现。
hashCode的基本约定是:
1、hashCode方法在同一个object上不管被调用了多少次,在同一次执行的Java程序中,hashCode方法必须返回一个持续相同的int。在object被修改时,不给equals方法提供信息。这个int值在同一个程序的两次不同执行过程中(同一程序执行两次),不需要保持恒定。
2、如果两个object通过equals()方法判断相等,则调用它们的hashCode方法应该产生相同的结果。
3、两个通过equals()方法判定不相等的object,调用它们的hashCOde方法并不是必须返回不同的结果。但是,成序言们应该意识到对于不相等的object产生不同的int结果有助于提升hashtables的效率。
一般技术上,通过将object的内部地址转换为integer的方法来产生hashCode,但这不是必需的。
equals:
就是判断是否相等的方法。
基本约定如下:
自反:就是x.equals(x)应该返回true
对称:x.equals(y)返回true则y.equals(x)返回true
传递:x.euqls(y)==true,y.equals(z)==true,那么x.equals(z)也必须返回true
持续性:就是说如果x.equals(y)==true,不管它调用多少次都应该返回true
非空引用:x.equals(null)应该返回false
准则原因这里:
http://java.sun.com/j2se/1.3/docs/api/java/lang/Object.html#hashCode()
在实际Domain中如何实现他们比较好呢?从eclipseWork中的模板生成如下:
if (rhs == null) {
return false;
}
if (!(rhs instanceof Town)) {
return false;
}
Town that = (Town) rhs;
if ((this.getId() == null) || (that.getId() == null)) {
return false;
}
return (this.getId().equals(that.getId()));
}
if (this.hashValue == 0) {
int result = 17;
int idValue = (this.getId() == null) ? 0 : this.getId().hashCode();
result = (result * 37) + idValue;
this.hashValue = result;
}
return this.hashValue;
}
下一步还要继续研究,上面的的方法很类似于“ Java theory and practice: Hashing it out”
http://www-128.ibm.com/developerworks/java/library/j-jtp05273.html