老师请问为什么equals方法在重写时,hashCode方法为什么也建议重写呢?该怎么重写呢?
在API文档中equals()方法中这样写的:当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。这句话不太懂老师
正在回答
同学你好,可以这样理解,
1、对于第一个问题,该类中如果只重写hashCode()方法后,toString()输出的对象信息为什么一模一样啊(后面的地址也一样),但是此时调用equals()时仍然是false。
这里同学首先要分清,hashCode()方法是通过将该对象的内部地址转换成一个整数,并不是地址本身,而是对象在hash表中的地址, 而本身对象的地址是不可变的,两者不是一个!toString()输出的对象信息是调用重写后的hashcode()方法,也就是对象在hash表中的地址,所以输出的一致。而equals()返回false是因为equls()方法没有重写,相当于==,也就是比较本身对象的地址,而本身在内存中的地址是不可变的,所以仍然是false。
2、对于第二个问题,hashCode()方法为什么会影响到toString()方法后面对象地址的输出?
因为hashCode()方法被重写了,toString()方法也就是调用重写后的对象在hash表中的地址,所以会影响。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,
1、老师这里所描述的地址是指,在没有重写hashcode()方法时,也就是Object默认的hashcode方法的值是对象的内存地址,是由JDk底层代码实现的。
2、重写后的hashcode()是根据属性进行计算的。这里prime=31;是为了方便来计算散列结果,而设置的值。
3、与equals()方法的关系,老师在上面有讲到,因为两个对象相等其哈希值一定相等,所以要保证两个对象的hashcode方法的值相等。
4、源码里面object类的方法,public native int hashCode(); native 类型是Java本地接口,因为Java语言的实现是基于C++语言实现的,所以这里native 类型,其实是调用的底层C++代码实现的地址值,我们是看不到C++代码的哦。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,关于hashcode的讲解在后面的课程中会有更详细的讲解视频,这里老师简单说一下
1、例如现在有两个Student对象,重写equals()方法:
Student s1=new Student("小明",18);
Student s2=new Student("小明",18);
此时s1.equals(s2)一定返回true
假如只重写equals而不重写hashcode,那么Student类的hashcode方法就是Object默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址得来的,s1和s2是new的两个对象,在内存中的地址不同,故两者的hashcode不一定相等。
而重写了equals,且s1.equals(s2)返回true,根据hashcode的规则,两个对象相等其哈希值一定相等,所以矛盾就产生了,因此重写equals建议要重写hashcode。
2、重写hashcode():可以直接使用编译器Eclipse自动生成,不需要手动编写,右键-Source——Generate hashCode and equals... Eclipse就会自动生成啦~
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星