Hibernate中为什么要重写equals方法和hashcode方法

  1、*为什么要重写equals方法,首先我们来看一下equals源码:

equals(Object anObject) { 2if (this == anObject) {; 4 } 5if (anObject instanceof String) { 6String anotherString = (String)anObject; 7int n = count; 8if (n == anotherString.count) { 9char v1[] = value;10char v2[] = anotherString.value;11int i = offset;12int j = anotherString.offset;13while (n– != 0) {14if (v1[i++] != v2[j++]);16 };18 }19 };21}

View Code

*可以看出首先判定的是两个类的地址是否一致,如果是同一个类则地址相同,则符合;

*其次如果比较的两个类是String类则比较他们每个字符是否一致,如果一致则符合;

*可以看出,原来的equals方法并没有给出其他类比较的具体依据,如果两个Person类如果id一直我们则认为相同,

所以持久化时,hibernate会调用equals方法判断两个实体是否相同,,即:数据库中两行是否一样,我们必须给出判定方法,原来的equals是不够用的

  2、*为什么要重写Hashcode方法,我们任然来看一段代码:

1 import java.util.HashSet; Test { 4 5 String name; Test(String name) { 8this.name = name; 9 } main(String[] args) {HashSet<Test> hs=new HashSet<Test>();15Test t1=new Test(“abc”);16Test t2=new Test(“abc”);17 System.out.println(t1.equals(t2));18 hs.add(t1);19 hs.add(t2);20 System.out.println(hs.size());21 }22 23 @Override equals(Object obj) {(this == obj);(obj instanceof Test) {29String name = ((Test) obj).name;30if (this.name.equals(name));;;36 }37 38 }

View Code

*上面代码运行结果为:

true2

我们发现当我们重写equals后,破坏了一些Java规则:如果两个对象相等,则不能放到HashSet集合中,但上面的结果恰恰相反,两个对象相等,却任然能放到HashSet中

*由此我们可以看出,放入HashSet集合时,并没有调用equals方法,那HashSet判断两个对象相等调用的是什么方法呢?很显然调用了HashCode方法,当我们重写Hashcode方法后,就会满足上述规则,所以重写equals方法后必须重写hashcode方法;

  3、总结:equals和hashcode方法是重两个不同角度判断对象相等的,但前提是他们的效果必须一致:即有一个判断相等,则另一个必须判断为相等;

却还是,会愚蠢的选择相互敌视的方式。即使背脊相抵,

Hibernate中为什么要重写equals方法和hashcode方法

相关文章:

你感兴趣的文章:

标签云: