问答详情
源自:6-2 学生选课---判断 Set 中课程是否存在

为何要重写Course下的hashCode()和equals()方法?重写方法的代码是自动生成的且只字未改。

重写的hashCode()和equals()方法,区别只是方法所在的位置不同,方法原来的代码在父类Object类,而重写后方法在子类Course中,既然代码没有作任何改动为何运行结果会不一样呢?

看了很多类似问题,但没能看得懂呢,能否通俗易懂的讲解下?

提问者:慕勒9549435 2017-10-05 20:59

个回答

  • 申申申申申
    2018-02-27 16:50:22
    已采纳

    感觉和这个问题的原因类似,可以参考理解一下

    在hibernate中,它认为2个对象只要equals返回true,那么hashCode一定相等。 但是实际情况呢?

    User u1 = new User(“张三”);

    User u2 = new User(“张三”);

    由于我们重写了User的equals方法,所以 u1.equals(u2);返回true 但是,User并没有重写hashCode方法,它用的是Object类的hashCode方法,所以 u1.hashCode = 31050006 u2.hashCode = 31587890 两者的hashCode并不相等。违背了hibernate的原则 由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写User 的hashCode方法。如何重写hashCode方法呢?

    哈希码要完成这么一件事,首先要保证如果equlas出来的结果相等,那么hashCode也相等。像上面的u1和u2,由于名字都是“张三”,所以应该返回相同的hashCode。所以我们可以想一个办法。让User的[2]  哈希码返回User里面name字段的哈希码,这样就保证,名字相同的人,不但equlas方法相同,而且hashCode相等。 那么User类就变成

    public class User{

    private String userName;

    //覆盖Object里的equals方法

    public boolean equals(Object arg0){

    if(!(arg0 instanceof User)){

    return false;

    }

    User user = (User)arg0;

    //如果名字相同,则表示属于同一个对象。

    if (user.getName().equals(this.getName)){

    return true;

    }else{

    return false;

    }

    }

    //覆盖Object里的hashCode方法

    public int hashCode() {

    return name.hashCode();//返回名字的哈希码。

    }

    }

    这样可以保证hibernate根据我们自己的需求来判断重复对象

    (以上引自百度百科https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E7%A0%81/5035512?fr=aladdin,如侵权则删除)

  • Sean_Chou
    2017-11-19 22:21:16

    有一点是可以肯定的,虽然没有改动,但肯定和Object类中的方法体是不一样的。至于为什么会自动重写成那样,我也不清楚。

  • 舞女泪
    2017-10-06 15:43:42

     兄弟去看看这个,这个要看个人理解,,,http://huaxia524151.iteye.com/blog/729074