java equals 与 hashcode的理解
[url]http://blog.csdn.net/lishehe/article/details/18839495[/url]
java 类的equals方法重写例子
hashcode重写
注意:当使用ORM的时候特别要注意的
如果你使用ORM处理一些对象的话,你要确保在hashCode()和equals()对象中使用getter和setter而不是直接引用成员变量。因为在ORM中有的时候成员变量会被延时加载,这些变量只有当getter方法被调用的时候才真正可用。
例如在我们的例子中,如果我们使用e1.id == e2.id则可能会出现这个问题,但是我们使用e1.getId() == e2.getId()就不会出现这个问题。
两个对象先比较的事hashcode,再比较equals。如果equals相等,说明hashcode相等,如果两个对象hashcode相等,不一定说明两者相等,只能说明它们在同一个hash链表上,还需要比较它们的equals方法。
原文链接[url]http://www.oschina.net/question/82993_75533[/url]
[url]http://blog.csdn.net/lishehe/article/details/18839495[/url]
java 类的equals方法重写例子
public boolean equals(Object o) {
if(o == null) {
return false;
}
if (o == this){
return true;
}
if (getClass() != o.getClass()){
return false;
}
Employee e = (Employee) o;
return (this.getId() == e.getId());
//如果有引入common包则可以用 Apache Commons Lang包重写hashCode() 和equals()方法
//return new EqualsBuilder().append(getId(), e.getId()).sEquals();
}
hashcode重写
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
//Apache Commons final int PRIME = 31;
// return new HashCodeBuilder(getId()%2==0?getId()+1:getId(),PRIME).toHashCode();
注意:当使用ORM的时候特别要注意的
如果你使用ORM处理一些对象的话,你要确保在hashCode()和equals()对象中使用getter和setter而不是直接引用成员变量。因为在ORM中有的时候成员变量会被延时加载,这些变量只有当getter方法被调用的时候才真正可用。
例如在我们的例子中,如果我们使用e1.id == e2.id则可能会出现这个问题,但是我们使用e1.getId() == e2.getId()就不会出现这个问题。
两个对象先比较的事hashcode,再比较equals。如果equals相等,说明hashcode相等,如果两个对象hashcode相等,不一定说明两者相等,只能说明它们在同一个hash链表上,还需要比较它们的equals方法。
原文链接[url]http://www.oschina.net/question/82993_75533[/url]