- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详解equals()方法和hashCode()方法
Java的基类Object供应了一些方法,其中equals()方法用于推断两个对象能否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。
本文引见了2种方法在使用和重写时,一些需要留意的问题。
一、equal()方法
?Object类中equals()方法实现如下:
1
2
3
public?boolean?equals(Object obj) {
????return?(this?== obj);
}
通过该实现可以看出,Object类的实现接受了区分度最高的算法,即只需两个对象不是同一个对象,那么equals()肯定前往false。
虽然我们在定义类时,可以重写equals()方法,但是有一些留意事项;JDK中说明白实现equals()方法应当恪守的商定:
(1)自反性:x.equals(x)必需前往true。
(2)对称性:x.equals(y)与y.equals(x)的前往值必需相等。
(3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必需为true。
(4)全都性:假如对象x和y在equals()中使用的信息都没有转变,那么x.equals(y)值一直不变。
(5)非null:x不是null,y为null,则x.equals(y)必需为false。
二、hashCode()方法
1、Object的hashCode()
Object类中hashCode()方法的声明如下:
1
public?native?int?hashCode();
可以看出,hashCode()是一个native方法,而且前往值类型是整形;实际上,该native方法将对象在内存中的地址作为哈希码前往,可以保证不同对象的前往值不同。
与equals()方法类似,hashCode()方法可以被重写。JDK中对hashCode()方法的作用,以及实现时的留意事项做了说明:
(1)hashCode()在哈希表中起作用,如java.util.HashMap。
(2)假如对象在equals()中使用的信息都没有转变,那么hashCode()值一直不变。
(3)假如两个对象使用equals()方法推断为相等,则hashCode()方法也应当相等。
(4)假如两个对象使用equals()方法推断为不相等,则不要求hashCode()也必需不相等;但是开发人员应当生疏到,不相等的对象产生不相同的hashCode可以提高哈希表的功能。
2、hashCode()的作用
总的来说,hashCode()在哈希表中起作用,如HashSet、HashMap等。
当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。假如该位置没有对象,可以直接将object插入该位置;假如该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object能否相等,假如相等,则不需要保存object;假如不相等,则将该对象加入到链表中。
这也就解释了为什么equals()相等,则hashCode()必需相等。假如两个对象equals()相等,则它们在哈希表(如HashSet、HashMap等)中只应当消灭一次;假如hashCode()不相等,那么它们会被散列到哈希表的不同位置,哈希表中消灭了不止一次。
实际上,在JVM中,加载的对象在内存中包括三部分:对象头、实例数据、填充。其中,对象头包括指向对象所属类型的指针和MarkWord,而MarkWord中除了包含对象的GC分代年龄信息、加锁形态信息外,还包括了对象的hashcode;对象实例数据是对象真正存储的有效信息;填充部分仅起到占位符的作用, 缘由是HotSpot要求对象起始地址必需是8字节的整数倍。
三、String中equals()和hashCode()的实现
String类中相关实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private?final?char?value[];
private?int?hash;?// Default to 0
public?boolean?equals(Object anObject) {
????if?(this?== anObject) {
????????return?true;
????}
????if?(an
您可能关注的文档
最近下载
- 2024大学生人文知识竞赛题库及参考答案.docx VIP
- 2025三年级上册道德与法治 第5课《走近科学家》(第二课时)教学课件.pptx
- 四年级上册道德与法治课件第四课时与家务活“签约”人教部编版.ppt VIP
- 第三次全国土壤普查耕地质量等级评价技术规范.pdf VIP
- UVmini-1240使用指南 岛津紫外可见光分光光度计.pdf VIP
- 【2024】人教鄂教版科学六年级上册每课教学反思(带目录) .pdf VIP
- 教学-高中物必修一、二、三基本知识背记检查清单大傻B.ppt VIP
- 2025年新能源太阳能光伏产业发展白皮书.docx VIP
- 设备管理成熟度(星级)评价准则.pdf VIP
- GB50231-2009 机械设备安装工程施工及验收通用规范.docx VIP
文档评论(0)